1c2aa98e2SPeter Wemm /* 212ed1c7cSGregory Neil Shapiro * Copyright (c) 1998-2002 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 * 12c2aa98e2SPeter Wemm */ 13c2aa98e2SPeter Wemm 1412ed1c7cSGregory Neil Shapiro #include <sendmail.h> 1512ed1c7cSGregory Neil Shapiro 169d8fddc1SGregory Neil Shapiro SM_RCSID("@(#)$Id: conf.c,v 8.972.2.5 2002/08/16 14:56:01 ca Exp $") 17c2aa98e2SPeter Wemm 183299c2f1SGregory Neil Shapiro /* $FreeBSD$ */ 193299c2f1SGregory Neil Shapiro 203299c2f1SGregory Neil Shapiro #include <sendmail/pathnames.h> 213299c2f1SGregory Neil Shapiro 22c2aa98e2SPeter Wemm # include <sys/ioctl.h> 23c2aa98e2SPeter Wemm # include <sys/param.h> 243299c2f1SGregory Neil Shapiro 25c2aa98e2SPeter Wemm #include <limits.h> 263299c2f1SGregory Neil Shapiro #if NETINET || NETINET6 273299c2f1SGregory Neil Shapiro # include <arpa/inet.h> 283299c2f1SGregory Neil Shapiro #endif /* NETINET || NETINET6 */ 293299c2f1SGregory Neil Shapiro #if HASULIMIT && defined(HPUX11) 303299c2f1SGregory Neil Shapiro # include <ulimit.h> 313299c2f1SGregory Neil Shapiro #endif /* HASULIMIT && defined(HPUX11) */ 323299c2f1SGregory Neil Shapiro 333299c2f1SGregory Neil Shapiro 343299c2f1SGregory Neil Shapiro static void setupmaps __P((void)); 353299c2f1SGregory Neil Shapiro static void setupmailers __P((void)); 3612ed1c7cSGregory Neil Shapiro static void setupqueues __P((void)); 373299c2f1SGregory Neil Shapiro static int get_num_procs_online __P((void)); 383299c2f1SGregory Neil Shapiro 39c2aa98e2SPeter Wemm 40c2aa98e2SPeter Wemm /* 41c2aa98e2SPeter Wemm ** CONF.C -- Sendmail Configuration Tables. 42c2aa98e2SPeter Wemm ** 43c2aa98e2SPeter Wemm ** Defines the configuration of this installation. 44c2aa98e2SPeter Wemm ** 45c2aa98e2SPeter Wemm ** Configuration Variables: 46c2aa98e2SPeter Wemm ** HdrInfo -- a table describing well-known header fields. 47c2aa98e2SPeter Wemm ** Each entry has the field name and some flags, 48c2aa98e2SPeter Wemm ** which are described in sendmail.h. 49c2aa98e2SPeter Wemm ** 50c2aa98e2SPeter Wemm ** Notes: 51c2aa98e2SPeter Wemm ** I have tried to put almost all the reasonable 52c2aa98e2SPeter Wemm ** configuration information into the configuration 53c2aa98e2SPeter Wemm ** file read at runtime. My intent is that anything 54c2aa98e2SPeter Wemm ** here is a function of the version of UNIX you 55c2aa98e2SPeter Wemm ** are running, or is really static -- for example 56c2aa98e2SPeter Wemm ** the headers are a superset of widely used 57c2aa98e2SPeter Wemm ** protocols. If you find yourself playing with 58c2aa98e2SPeter Wemm ** this file too much, you may be making a mistake! 59c2aa98e2SPeter Wemm */ 60c2aa98e2SPeter Wemm 61c2aa98e2SPeter Wemm 62c2aa98e2SPeter Wemm /* 63c2aa98e2SPeter Wemm ** Header info table 64c2aa98e2SPeter Wemm ** Final (null) entry contains the flags used for any other field. 65c2aa98e2SPeter Wemm ** 66c2aa98e2SPeter Wemm ** Not all of these are actually handled specially by sendmail 67c2aa98e2SPeter Wemm ** at this time. They are included as placeholders, to let 68c2aa98e2SPeter Wemm ** you know that "someday" I intend to have sendmail do 69c2aa98e2SPeter Wemm ** something with them. 70c2aa98e2SPeter Wemm */ 71c2aa98e2SPeter Wemm 72c2aa98e2SPeter Wemm struct hdrinfo HdrInfo[] = 73c2aa98e2SPeter Wemm { 74c2aa98e2SPeter Wemm /* originator fields, most to least significant */ 753299c2f1SGregory Neil Shapiro { "resent-sender", H_FROM|H_RESENT, NULL }, 763299c2f1SGregory Neil Shapiro { "resent-from", H_FROM|H_RESENT, NULL }, 773299c2f1SGregory Neil Shapiro { "resent-reply-to", H_FROM|H_RESENT, NULL }, 783299c2f1SGregory Neil Shapiro { "sender", H_FROM, NULL }, 793299c2f1SGregory Neil Shapiro { "from", H_FROM, NULL }, 803299c2f1SGregory Neil Shapiro { "reply-to", H_FROM, NULL }, 813299c2f1SGregory Neil Shapiro { "errors-to", H_FROM|H_ERRORSTO, NULL }, 823299c2f1SGregory Neil Shapiro { "full-name", H_ACHECK, NULL }, 833299c2f1SGregory Neil Shapiro { "return-receipt-to", H_RECEIPTTO, NULL }, 8412ed1c7cSGregory Neil Shapiro { "disposition-notification-to", H_FROM, NULL }, 85c2aa98e2SPeter Wemm 86c2aa98e2SPeter Wemm /* destination fields */ 873299c2f1SGregory Neil Shapiro { "to", H_RCPT, NULL }, 883299c2f1SGregory Neil Shapiro { "resent-to", H_RCPT|H_RESENT, NULL }, 893299c2f1SGregory Neil Shapiro { "cc", H_RCPT, NULL }, 903299c2f1SGregory Neil Shapiro { "resent-cc", H_RCPT|H_RESENT, NULL }, 913299c2f1SGregory Neil Shapiro { "bcc", H_RCPT|H_BCC, NULL }, 923299c2f1SGregory Neil Shapiro { "resent-bcc", H_RCPT|H_BCC|H_RESENT, NULL }, 933299c2f1SGregory Neil Shapiro { "apparently-to", H_RCPT, NULL }, 94c2aa98e2SPeter Wemm 95c2aa98e2SPeter Wemm /* message identification and control */ 963299c2f1SGregory Neil Shapiro { "message-id", 0, NULL }, 973299c2f1SGregory Neil Shapiro { "resent-message-id", H_RESENT, NULL }, 983299c2f1SGregory Neil Shapiro { "message", H_EOH, NULL }, 993299c2f1SGregory Neil Shapiro { "text", H_EOH, NULL }, 100c2aa98e2SPeter Wemm 101c2aa98e2SPeter Wemm /* date fields */ 1023299c2f1SGregory Neil Shapiro { "date", 0, NULL }, 1033299c2f1SGregory Neil Shapiro { "resent-date", H_RESENT, NULL }, 104c2aa98e2SPeter Wemm 105c2aa98e2SPeter Wemm /* trace fields */ 1063299c2f1SGregory Neil Shapiro { "received", H_TRACE|H_FORCE, NULL }, 1073299c2f1SGregory Neil Shapiro { "x400-received", H_TRACE|H_FORCE, NULL }, 1083299c2f1SGregory Neil Shapiro { "via", H_TRACE|H_FORCE, NULL }, 1093299c2f1SGregory Neil Shapiro { "mail-from", H_TRACE|H_FORCE, NULL }, 110c2aa98e2SPeter Wemm 111c2aa98e2SPeter Wemm /* miscellaneous fields */ 1123299c2f1SGregory Neil Shapiro { "comments", H_FORCE|H_ENCODABLE, NULL }, 1133299c2f1SGregory Neil Shapiro { "return-path", H_FORCE|H_ACHECK|H_BINDLATE, NULL }, 1143299c2f1SGregory Neil Shapiro { "content-transfer-encoding", H_CTE, NULL }, 1153299c2f1SGregory Neil Shapiro { "content-type", H_CTYPE, NULL }, 1163299c2f1SGregory Neil Shapiro { "content-length", H_ACHECK, NULL }, 1173299c2f1SGregory Neil Shapiro { "subject", H_ENCODABLE, NULL }, 1183299c2f1SGregory Neil Shapiro { "x-authentication-warning", H_FORCE, NULL }, 119c2aa98e2SPeter Wemm 1203299c2f1SGregory Neil Shapiro { NULL, 0, NULL } 121c2aa98e2SPeter Wemm }; 122c2aa98e2SPeter Wemm 123c2aa98e2SPeter Wemm 124c2aa98e2SPeter Wemm 125c2aa98e2SPeter Wemm /* 126c2aa98e2SPeter Wemm ** Privacy values 127c2aa98e2SPeter Wemm */ 128c2aa98e2SPeter Wemm 129c2aa98e2SPeter Wemm struct prival PrivacyValues[] = 130c2aa98e2SPeter Wemm { 131c2aa98e2SPeter Wemm { "public", PRIV_PUBLIC }, 132c2aa98e2SPeter Wemm { "needmailhelo", PRIV_NEEDMAILHELO }, 133c2aa98e2SPeter Wemm { "needexpnhelo", PRIV_NEEDEXPNHELO }, 134c2aa98e2SPeter Wemm { "needvrfyhelo", PRIV_NEEDVRFYHELO }, 135c2aa98e2SPeter Wemm { "noexpn", PRIV_NOEXPN }, 136c2aa98e2SPeter Wemm { "novrfy", PRIV_NOVRFY }, 13712ed1c7cSGregory Neil Shapiro { "restrictexpand", PRIV_RESTRICTEXPAND }, 138c2aa98e2SPeter Wemm { "restrictmailq", PRIV_RESTRICTMAILQ }, 139c2aa98e2SPeter Wemm { "restrictqrun", PRIV_RESTRICTQRUN }, 140c2aa98e2SPeter Wemm { "noetrn", PRIV_NOETRN }, 141c2aa98e2SPeter Wemm { "noverb", PRIV_NOVERB }, 142c2aa98e2SPeter Wemm { "authwarnings", PRIV_AUTHWARNINGS }, 143c2aa98e2SPeter Wemm { "noreceipts", PRIV_NORECEIPTS }, 1443299c2f1SGregory Neil Shapiro { "nobodyreturn", PRIV_NOBODYRETN }, 145c2aa98e2SPeter Wemm { "goaway", PRIV_GOAWAY }, 146c2aa98e2SPeter Wemm { NULL, 0 } 147c2aa98e2SPeter Wemm }; 148c2aa98e2SPeter Wemm 149c2aa98e2SPeter Wemm /* 150c2aa98e2SPeter Wemm ** DontBlameSendmail values 151c2aa98e2SPeter Wemm */ 15212ed1c7cSGregory Neil Shapiro 153c2aa98e2SPeter Wemm struct dbsval DontBlameSendmailValues[] = 154c2aa98e2SPeter Wemm { 155c2aa98e2SPeter Wemm { "safe", DBS_SAFE }, 156c2aa98e2SPeter Wemm { "assumesafechown", DBS_ASSUMESAFECHOWN }, 157c2aa98e2SPeter Wemm { "groupwritabledirpathsafe", DBS_GROUPWRITABLEDIRPATHSAFE }, 158c2aa98e2SPeter Wemm { "groupwritableforwardfilesafe", 159c2aa98e2SPeter Wemm DBS_GROUPWRITABLEFORWARDFILESAFE }, 160c2aa98e2SPeter Wemm { "groupwritableincludefilesafe", 161c2aa98e2SPeter Wemm DBS_GROUPWRITABLEINCLUDEFILESAFE }, 162c2aa98e2SPeter Wemm { "groupwritablealiasfile", DBS_GROUPWRITABLEALIASFILE }, 163c2aa98e2SPeter Wemm { "worldwritablealiasfile", DBS_WORLDWRITABLEALIASFILE }, 164c2aa98e2SPeter Wemm { "forwardfileinunsafedirpath", DBS_FORWARDFILEINUNSAFEDIRPATH }, 165c2aa98e2SPeter Wemm { "includefileinunsafedirpath", DBS_INCLUDEFILEINUNSAFEDIRPATH }, 166c2aa98e2SPeter Wemm { "mapinunsafedirpath", DBS_MAPINUNSAFEDIRPATH }, 167c2aa98e2SPeter Wemm { "linkedaliasfileinwritabledir", 168c2aa98e2SPeter Wemm DBS_LINKEDALIASFILEINWRITABLEDIR }, 169c2aa98e2SPeter Wemm { "linkedclassfileinwritabledir", 170c2aa98e2SPeter Wemm DBS_LINKEDCLASSFILEINWRITABLEDIR }, 171c2aa98e2SPeter Wemm { "linkedforwardfileinwritabledir", 172c2aa98e2SPeter Wemm DBS_LINKEDFORWARDFILEINWRITABLEDIR }, 173c2aa98e2SPeter Wemm { "linkedincludefileinwritabledir", 174c2aa98e2SPeter Wemm DBS_LINKEDINCLUDEFILEINWRITABLEDIR }, 175c2aa98e2SPeter Wemm { "linkedmapinwritabledir", DBS_LINKEDMAPINWRITABLEDIR }, 176c2aa98e2SPeter Wemm { "linkedserviceswitchfileinwritabledir", 177c2aa98e2SPeter Wemm DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR }, 178c2aa98e2SPeter Wemm { "filedeliverytohardlink", DBS_FILEDELIVERYTOHARDLINK }, 179c2aa98e2SPeter Wemm { "filedeliverytosymlink", DBS_FILEDELIVERYTOSYMLINK }, 180c2aa98e2SPeter Wemm { "writemaptohardlink", DBS_WRITEMAPTOHARDLINK }, 181c2aa98e2SPeter Wemm { "writemaptosymlink", DBS_WRITEMAPTOSYMLINK }, 182c2aa98e2SPeter Wemm { "writestatstohardlink", DBS_WRITESTATSTOHARDLINK }, 183c2aa98e2SPeter Wemm { "writestatstosymlink", DBS_WRITESTATSTOSYMLINK }, 184c2aa98e2SPeter Wemm { "forwardfileingroupwritabledirpath", 185c2aa98e2SPeter Wemm DBS_FORWARDFILEINGROUPWRITABLEDIRPATH }, 186c2aa98e2SPeter Wemm { "includefileingroupwritabledirpath", 187c2aa98e2SPeter Wemm DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH }, 188c2aa98e2SPeter Wemm { "classfileinunsafedirpath", DBS_CLASSFILEINUNSAFEDIRPATH }, 189c2aa98e2SPeter Wemm { "errorheaderinunsafedirpath", DBS_ERRORHEADERINUNSAFEDIRPATH }, 190c2aa98e2SPeter Wemm { "helpfileinunsafedirpath", DBS_HELPFILEINUNSAFEDIRPATH }, 191c2aa98e2SPeter Wemm { "forwardfileinunsafedirpathsafe", 192c2aa98e2SPeter Wemm DBS_FORWARDFILEINUNSAFEDIRPATHSAFE }, 193c2aa98e2SPeter Wemm { "includefileinunsafedirpathsafe", 194c2aa98e2SPeter Wemm DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE }, 195c2aa98e2SPeter Wemm { "runprograminunsafedirpath", DBS_RUNPROGRAMINUNSAFEDIRPATH }, 196c2aa98e2SPeter Wemm { "runwritableprogram", DBS_RUNWRITABLEPROGRAM }, 1973299c2f1SGregory Neil Shapiro { "nonrootsafeaddr", DBS_NONROOTSAFEADDR }, 1983299c2f1SGregory Neil Shapiro { "truststickybit", DBS_TRUSTSTICKYBIT }, 1993299c2f1SGregory Neil Shapiro { "dontwarnforwardfileinunsafedirpath", 2003299c2f1SGregory Neil Shapiro DBS_DONTWARNFORWARDFILEINUNSAFEDIRPATH }, 2013299c2f1SGregory Neil Shapiro { "insufficiententropy", DBS_INSUFFICIENTENTROPY }, 20212ed1c7cSGregory Neil Shapiro { "groupreadablesasldbfile", DBS_GROUPREADABLESASLDBFILE }, 20312ed1c7cSGregory Neil Shapiro { "groupwritablesasldbfile", DBS_GROUPWRITABLESASLDBFILE }, 204d995d2baSGregory Neil Shapiro { "groupwritableforwardfile", DBS_GROUPWRITABLEFORWARDFILE }, 205d995d2baSGregory Neil Shapiro { "groupwritableincludefile", DBS_GROUPWRITABLEINCLUDEFILE }, 206d995d2baSGregory Neil Shapiro { "worldwritableforwardfile", DBS_WORLDWRITABLEFORWARDFILE }, 207d995d2baSGregory Neil Shapiro { "worldwritableincludefile", DBS_WORLDWRITABLEINCLUDEFILE }, 20812ed1c7cSGregory Neil Shapiro { "groupreadablekeyfile", DBS_GROUPREADABLEKEYFILE }, 20912ed1c7cSGregory Neil Shapiro #if _FFR_GROUPREADABLEAUTHINFOFILE 21012ed1c7cSGregory Neil Shapiro { "groupreadableadefaultauthinfofile", 21112ed1c7cSGregory Neil Shapiro DBS_GROUPREADABLEAUTHINFOFILE }, 21212ed1c7cSGregory Neil Shapiro #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */ 213c2aa98e2SPeter Wemm { NULL, 0 } 214c2aa98e2SPeter Wemm }; 215c2aa98e2SPeter Wemm 216c2aa98e2SPeter Wemm /* 217c2aa98e2SPeter Wemm ** Miscellaneous stuff. 218c2aa98e2SPeter Wemm */ 219c2aa98e2SPeter Wemm 220c2aa98e2SPeter Wemm int DtableSize = 50; /* max open files; reset in 4.2bsd */ 22112ed1c7cSGregory Neil Shapiro /* 222c2aa98e2SPeter Wemm ** SETDEFAULTS -- set default values 223c2aa98e2SPeter Wemm ** 22412ed1c7cSGregory Neil Shapiro ** Some of these must be initialized using direct code since they 22512ed1c7cSGregory Neil Shapiro ** depend on run-time values. So let's do all of them this way. 226c2aa98e2SPeter Wemm ** 227c2aa98e2SPeter Wemm ** Parameters: 228c2aa98e2SPeter Wemm ** e -- the default envelope. 229c2aa98e2SPeter Wemm ** 230c2aa98e2SPeter Wemm ** Returns: 231c2aa98e2SPeter Wemm ** none. 232c2aa98e2SPeter Wemm ** 233c2aa98e2SPeter Wemm ** Side Effects: 234c2aa98e2SPeter Wemm ** Initializes a bunch of global variables to their 235c2aa98e2SPeter Wemm ** default values. 236c2aa98e2SPeter Wemm */ 237c2aa98e2SPeter Wemm 238c2aa98e2SPeter Wemm #define MINUTES * 60 239c2aa98e2SPeter Wemm #define HOURS * 60 MINUTES 240c2aa98e2SPeter Wemm #define DAYS * 24 HOURS 241c2aa98e2SPeter Wemm 242c2aa98e2SPeter Wemm #ifndef MAXRULERECURSION 243c2aa98e2SPeter Wemm # define MAXRULERECURSION 50 /* max ruleset recursion depth */ 2443299c2f1SGregory Neil Shapiro #endif /* ! MAXRULERECURSION */ 245c2aa98e2SPeter Wemm 246c2aa98e2SPeter Wemm void 247c2aa98e2SPeter Wemm setdefaults(e) 248c2aa98e2SPeter Wemm register ENVELOPE *e; 249c2aa98e2SPeter Wemm { 250c2aa98e2SPeter Wemm int i; 2513299c2f1SGregory Neil Shapiro int numprocs; 252c2aa98e2SPeter Wemm struct passwd *pw; 253c2aa98e2SPeter Wemm 2543299c2f1SGregory Neil Shapiro numprocs = get_num_procs_online(); 255c2aa98e2SPeter Wemm SpaceSub = ' '; /* option B */ 2563299c2f1SGregory Neil Shapiro QueueLA = 8 * numprocs; /* option x */ 2573299c2f1SGregory Neil Shapiro RefuseLA = 12 * numprocs; /* option X */ 258c2aa98e2SPeter Wemm WkRecipFact = 30000L; /* option y */ 259c2aa98e2SPeter Wemm WkClassFact = 1800L; /* option z */ 260c2aa98e2SPeter Wemm WkTimeFact = 90000L; /* option Z */ 261c2aa98e2SPeter Wemm QueueFactor = WkRecipFact * 20; /* option q */ 26212ed1c7cSGregory Neil Shapiro #if _FFR_QUARANTINE 26312ed1c7cSGregory Neil Shapiro QueueMode = QM_NORMAL; /* what queue items to act upon */ 26412ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUARANTINE */ 265c2aa98e2SPeter Wemm FileMode = (RealUid != geteuid()) ? 0644 : 0600; 266c2aa98e2SPeter Wemm /* option F */ 2673299c2f1SGregory Neil Shapiro QueueFileMode = (RealUid != geteuid()) ? 0644 : 0600; 2683299c2f1SGregory Neil Shapiro /* option QueueFileMode */ 269c2aa98e2SPeter Wemm 2703299c2f1SGregory Neil Shapiro if (((pw = sm_getpwnam("mailnull")) != NULL && pw->pw_uid != 0) || 2713299c2f1SGregory Neil Shapiro ((pw = sm_getpwnam("sendmail")) != NULL && pw->pw_uid != 0) || 2723299c2f1SGregory Neil Shapiro ((pw = sm_getpwnam("daemon")) != NULL && pw->pw_uid != 0)) 273c2aa98e2SPeter Wemm { 274c2aa98e2SPeter Wemm DefUid = pw->pw_uid; /* option u */ 275c2aa98e2SPeter Wemm DefGid = pw->pw_gid; /* option g */ 276c2aa98e2SPeter Wemm DefUser = newstr(pw->pw_name); 277c2aa98e2SPeter Wemm } 278c2aa98e2SPeter Wemm else 279c2aa98e2SPeter Wemm { 280c2aa98e2SPeter Wemm DefUid = 1; /* option u */ 281c2aa98e2SPeter Wemm DefGid = 1; /* option g */ 282c2aa98e2SPeter Wemm setdefuser(); 283c2aa98e2SPeter Wemm } 28476b7bf71SPeter Wemm TrustedUid = 0; 285c2aa98e2SPeter Wemm if (tTd(37, 4)) 28612ed1c7cSGregory Neil Shapiro sm_dprintf("setdefaults: DefUser=%s, DefUid=%d, DefGid=%d\n", 287c2aa98e2SPeter Wemm DefUser != NULL ? DefUser : "<1:1>", 288c2aa98e2SPeter Wemm (int) DefUid, (int) DefGid); 289c2aa98e2SPeter Wemm CheckpointInterval = 10; /* option C */ 290c2aa98e2SPeter Wemm MaxHopCount = 25; /* option h */ 2913299c2f1SGregory Neil Shapiro set_delivery_mode(SM_FORK, e); /* option d */ 292c2aa98e2SPeter Wemm e->e_errormode = EM_PRINT; /* option e */ 29312ed1c7cSGregory Neil Shapiro e->e_qgrp = NOQGRP; 29412ed1c7cSGregory Neil Shapiro e->e_qdir = NOQDIR; 29512ed1c7cSGregory Neil Shapiro e->e_xfqgrp = NOQGRP; 29612ed1c7cSGregory Neil Shapiro e->e_xfqdir = NOQDIR; 2973299c2f1SGregory Neil Shapiro e->e_ctime = curtime(); 29812ed1c7cSGregory Neil Shapiro SevenBitInput = false; /* option 7 */ 299c2aa98e2SPeter Wemm MaxMciCache = 1; /* option k */ 300c2aa98e2SPeter Wemm MciCacheTimeout = 5 MINUTES; /* option K */ 301c2aa98e2SPeter Wemm LogLevel = 9; /* option L */ 30212ed1c7cSGregory Neil Shapiro #if MILTER 30312ed1c7cSGregory Neil Shapiro MilterLogLevel = -1; 30412ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 30512ed1c7cSGregory Neil Shapiro inittimeouts(NULL, false); /* option r */ 306c2aa98e2SPeter Wemm PrivacyFlags = PRIV_PUBLIC; /* option p */ 30712ed1c7cSGregory Neil Shapiro MeToo = true; /* option m */ 30812ed1c7cSGregory Neil Shapiro SendMIMEErrors = true; /* option f */ 30912ed1c7cSGregory Neil Shapiro SuperSafe = SAFE_REALLY; /* option s */ 3103299c2f1SGregory Neil Shapiro clrbitmap(DontBlameSendmail); /* DontBlameSendmail option */ 311c2aa98e2SPeter Wemm #if MIME8TO7 312c2aa98e2SPeter Wemm MimeMode = MM_CVTMIME|MM_PASS8BIT; /* option 8 */ 3133299c2f1SGregory Neil Shapiro #else /* MIME8TO7 */ 314c2aa98e2SPeter Wemm MimeMode = MM_PASS8BIT; 3153299c2f1SGregory Neil Shapiro #endif /* MIME8TO7 */ 316c2aa98e2SPeter Wemm for (i = 0; i < MAXTOCLASS; i++) 317c2aa98e2SPeter Wemm { 318c2aa98e2SPeter Wemm TimeOuts.to_q_return[i] = 5 DAYS; /* option T */ 319c2aa98e2SPeter Wemm TimeOuts.to_q_warning[i] = 0; /* option T */ 320c2aa98e2SPeter Wemm } 3213299c2f1SGregory Neil Shapiro ServiceSwitchFile = "/etc/mail/service.switch"; 322c2aa98e2SPeter Wemm ServiceCacheMaxAge = (time_t) 10; 323c2aa98e2SPeter Wemm HostsFile = _PATH_HOSTS; 324c2aa98e2SPeter Wemm PidFile = newstr(_PATH_SENDMAILPID); 325c2aa98e2SPeter Wemm MustQuoteChars = "@,;:\\()[].'"; 326c2aa98e2SPeter Wemm MciInfoTimeout = 30 MINUTES; 327c2aa98e2SPeter Wemm MaxRuleRecursion = MAXRULERECURSION; 328c2aa98e2SPeter Wemm MaxAliasRecursion = 10; 329c2aa98e2SPeter Wemm MaxMacroRecursion = 10; 33012ed1c7cSGregory Neil Shapiro ColonOkInAddr = true; 33112ed1c7cSGregory Neil Shapiro DontLockReadFiles = true; 33212ed1c7cSGregory Neil Shapiro DontProbeInterfaces = DPI_PROBEALL; 333c2aa98e2SPeter Wemm DoubleBounceAddr = "postmaster"; 334e01d6f61SPeter Wemm MaxHeadersLength = MAXHDRSLEN; 3353299c2f1SGregory Neil Shapiro MaxForwardEntries = 0; 33612ed1c7cSGregory Neil Shapiro FastSplit = 1; 3373299c2f1SGregory Neil Shapiro #if SASL 3383299c2f1SGregory Neil Shapiro AuthMechanisms = newstr(AUTH_MECHANISMS); 33912ed1c7cSGregory Neil Shapiro MaxSLBits = INT_MAX; 3403299c2f1SGregory Neil Shapiro #endif /* SASL */ 34112ed1c7cSGregory Neil Shapiro #if STARTTLS 34212ed1c7cSGregory Neil Shapiro TLS_Srv_Opts = TLS_I_SRV; 34312ed1c7cSGregory Neil Shapiro #endif /* STARTTLS */ 344c2aa98e2SPeter Wemm #ifdef HESIOD_INIT 345c2aa98e2SPeter Wemm HesiodContext = NULL; 3463299c2f1SGregory Neil Shapiro #endif /* HESIOD_INIT */ 3473299c2f1SGregory Neil Shapiro #if NETINET6 3483299c2f1SGregory Neil Shapiro /* Detect if IPv6 is available at run time */ 3493299c2f1SGregory Neil Shapiro i = socket(AF_INET6, SOCK_STREAM, 0); 3503299c2f1SGregory Neil Shapiro if (i >= 0) 3513299c2f1SGregory Neil Shapiro { 3523299c2f1SGregory Neil Shapiro InetMode = AF_INET6; 3533299c2f1SGregory Neil Shapiro (void) close(i); 3543299c2f1SGregory Neil Shapiro } 3553299c2f1SGregory Neil Shapiro else 3563299c2f1SGregory Neil Shapiro InetMode = AF_INET; 3573299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 3583299c2f1SGregory Neil Shapiro InetMode = AF_INET; 3593299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 36076b7bf71SPeter Wemm ControlSocketName = NULL; 3613299c2f1SGregory Neil Shapiro memset(&ConnectOnlyTo, '\0', sizeof ConnectOnlyTo); 3623299c2f1SGregory Neil Shapiro DataFileBufferSize = 4096; 3633299c2f1SGregory Neil Shapiro XscriptFileBufferSize = 4096; 3643299c2f1SGregory Neil Shapiro for (i = 0; i < MAXRWSETS; i++) 3653299c2f1SGregory Neil Shapiro RuleSetNames[i] = NULL; 36612ed1c7cSGregory Neil Shapiro #if MILTER 3673299c2f1SGregory Neil Shapiro InputFilters[0] = NULL; 36812ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 369c2aa98e2SPeter Wemm setupmaps(); 37012ed1c7cSGregory Neil Shapiro setupqueues(); 371c2aa98e2SPeter Wemm setupmailers(); 372c2aa98e2SPeter Wemm setupheaders(); 373c2aa98e2SPeter Wemm } 374c2aa98e2SPeter Wemm 375c2aa98e2SPeter Wemm 376c2aa98e2SPeter Wemm /* 377c2aa98e2SPeter Wemm ** SETDEFUSER -- set/reset DefUser using DefUid (for initgroups()) 378c2aa98e2SPeter Wemm */ 379c2aa98e2SPeter Wemm 380c2aa98e2SPeter Wemm void 381c2aa98e2SPeter Wemm setdefuser() 382c2aa98e2SPeter Wemm { 383c2aa98e2SPeter Wemm struct passwd *defpwent; 384c2aa98e2SPeter Wemm static char defuserbuf[40]; 385c2aa98e2SPeter Wemm 386c2aa98e2SPeter Wemm DefUser = defuserbuf; 387c2aa98e2SPeter Wemm defpwent = sm_getpwuid(DefUid); 38812ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(defuserbuf, 38912ed1c7cSGregory Neil Shapiro (defpwent == NULL || defpwent->pw_name == NULL) 39012ed1c7cSGregory Neil Shapiro ? "nobody" : defpwent->pw_name, 39112ed1c7cSGregory Neil Shapiro sizeof defuserbuf); 392c2aa98e2SPeter Wemm if (tTd(37, 4)) 39312ed1c7cSGregory Neil Shapiro sm_dprintf("setdefuser: DefUid=%d, DefUser=%s\n", 394c2aa98e2SPeter Wemm (int) DefUid, DefUser); 395c2aa98e2SPeter Wemm } 39612ed1c7cSGregory Neil Shapiro /* 39712ed1c7cSGregory Neil Shapiro ** SETUPQUEUES -- initialize default queues 39812ed1c7cSGregory Neil Shapiro ** 39912ed1c7cSGregory Neil Shapiro ** The mqueue QUEUE structure gets filled in after readcf() but 40012ed1c7cSGregory Neil Shapiro ** we need something to point to now for the mailer setup, 40112ed1c7cSGregory Neil Shapiro ** which use "mqueue" as default queue. 40212ed1c7cSGregory Neil Shapiro */ 40312ed1c7cSGregory Neil Shapiro 40412ed1c7cSGregory Neil Shapiro static void 40512ed1c7cSGregory Neil Shapiro setupqueues() 40612ed1c7cSGregory Neil Shapiro { 40712ed1c7cSGregory Neil Shapiro char buf[100]; 40812ed1c7cSGregory Neil Shapiro 40912ed1c7cSGregory Neil Shapiro MaxRunnersPerQueue = 1; 41012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof buf); 41112ed1c7cSGregory Neil Shapiro makequeue(buf, false); 41212ed1c7cSGregory Neil Shapiro } 41312ed1c7cSGregory Neil Shapiro /* 414c2aa98e2SPeter Wemm ** SETUPMAILERS -- initialize default mailers 415c2aa98e2SPeter Wemm */ 416c2aa98e2SPeter Wemm 4173299c2f1SGregory Neil Shapiro static void 418c2aa98e2SPeter Wemm setupmailers() 419c2aa98e2SPeter Wemm { 420c2aa98e2SPeter Wemm char buf[100]; 421c2aa98e2SPeter Wemm 42212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u", 4233299c2f1SGregory Neil Shapiro sizeof buf); 424c2aa98e2SPeter Wemm makemailer(buf); 425c2aa98e2SPeter Wemm 42612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=X-Unix/X-Unix/X-Unix, A=FILE \201u", 4273299c2f1SGregory Neil Shapiro sizeof buf); 428c2aa98e2SPeter Wemm makemailer(buf); 429c2aa98e2SPeter Wemm 43012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u", 4313299c2f1SGregory Neil Shapiro sizeof buf); 432c2aa98e2SPeter Wemm makemailer(buf); 4333299c2f1SGregory Neil Shapiro initerrmailers(); 434c2aa98e2SPeter Wemm } 43512ed1c7cSGregory Neil Shapiro /* 436c2aa98e2SPeter Wemm ** SETUPMAPS -- set up map classes 437c2aa98e2SPeter Wemm */ 438c2aa98e2SPeter Wemm 439c2aa98e2SPeter Wemm #define MAPDEF(name, ext, flags, parse, open, close, lookup, store) \ 440c2aa98e2SPeter Wemm { \ 441c2aa98e2SPeter Wemm extern bool parse __P((MAP *, char *)); \ 442c2aa98e2SPeter Wemm extern bool open __P((MAP *, int)); \ 443c2aa98e2SPeter Wemm extern void close __P((MAP *)); \ 444c2aa98e2SPeter Wemm extern char *lookup __P((MAP *, char *, char **, int *)); \ 445c2aa98e2SPeter Wemm extern void store __P((MAP *, char *, char *)); \ 446c2aa98e2SPeter Wemm s = stab(name, ST_MAPCLASS, ST_ENTER); \ 447c2aa98e2SPeter Wemm s->s_mapclass.map_cname = name; \ 448c2aa98e2SPeter Wemm s->s_mapclass.map_ext = ext; \ 449c2aa98e2SPeter Wemm s->s_mapclass.map_cflags = flags; \ 450c2aa98e2SPeter Wemm s->s_mapclass.map_parse = parse; \ 451c2aa98e2SPeter Wemm s->s_mapclass.map_open = open; \ 452c2aa98e2SPeter Wemm s->s_mapclass.map_close = close; \ 453c2aa98e2SPeter Wemm s->s_mapclass.map_lookup = lookup; \ 454c2aa98e2SPeter Wemm s->s_mapclass.map_store = store; \ 455c2aa98e2SPeter Wemm } 456c2aa98e2SPeter Wemm 4573299c2f1SGregory Neil Shapiro static void 458c2aa98e2SPeter Wemm setupmaps() 459c2aa98e2SPeter Wemm { 460c2aa98e2SPeter Wemm register STAB *s; 461c2aa98e2SPeter Wemm 46212ed1c7cSGregory Neil Shapiro #if NEWDB 463c2aa98e2SPeter Wemm MAPDEF("hash", ".db", MCF_ALIASOK|MCF_REBUILDABLE, 464c2aa98e2SPeter Wemm map_parseargs, hash_map_open, db_map_close, 465c2aa98e2SPeter Wemm db_map_lookup, db_map_store); 466c2aa98e2SPeter Wemm 467c2aa98e2SPeter Wemm MAPDEF("btree", ".db", MCF_ALIASOK|MCF_REBUILDABLE, 468c2aa98e2SPeter Wemm map_parseargs, bt_map_open, db_map_close, 469c2aa98e2SPeter Wemm db_map_lookup, db_map_store); 4703299c2f1SGregory Neil Shapiro #endif /* NEWDB */ 471c2aa98e2SPeter Wemm 47212ed1c7cSGregory Neil Shapiro #if NDBM 473c2aa98e2SPeter Wemm MAPDEF("dbm", ".dir", MCF_ALIASOK|MCF_REBUILDABLE, 474c2aa98e2SPeter Wemm map_parseargs, ndbm_map_open, ndbm_map_close, 475c2aa98e2SPeter Wemm ndbm_map_lookup, ndbm_map_store); 4763299c2f1SGregory Neil Shapiro #endif /* NDBM */ 477c2aa98e2SPeter Wemm 47812ed1c7cSGregory Neil Shapiro #if NIS 479c2aa98e2SPeter Wemm MAPDEF("nis", NULL, MCF_ALIASOK, 480c2aa98e2SPeter Wemm map_parseargs, nis_map_open, null_map_close, 481c2aa98e2SPeter Wemm nis_map_lookup, null_map_store); 4823299c2f1SGregory Neil Shapiro #endif /* NIS */ 483c2aa98e2SPeter Wemm 48412ed1c7cSGregory Neil Shapiro #if NISPLUS 485c2aa98e2SPeter Wemm MAPDEF("nisplus", NULL, MCF_ALIASOK, 486c2aa98e2SPeter Wemm map_parseargs, nisplus_map_open, null_map_close, 487c2aa98e2SPeter Wemm nisplus_map_lookup, null_map_store); 4883299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 4893299c2f1SGregory Neil Shapiro 49012ed1c7cSGregory Neil Shapiro #if LDAPMAP 49112ed1c7cSGregory Neil Shapiro MAPDEF("ldap", NULL, MCF_ALIASOK|MCF_NOTPERSIST, 4923299c2f1SGregory Neil Shapiro ldapmap_parseargs, ldapmap_open, ldapmap_close, 4933299c2f1SGregory Neil Shapiro ldapmap_lookup, null_map_store); 4943299c2f1SGregory Neil Shapiro #endif /* LDAPMAP */ 4953299c2f1SGregory Neil Shapiro 49612ed1c7cSGregory Neil Shapiro #if PH_MAP 49712ed1c7cSGregory Neil Shapiro MAPDEF("ph", NULL, MCF_NOTPERSIST, 4983299c2f1SGregory Neil Shapiro ph_map_parseargs, ph_map_open, ph_map_close, 4993299c2f1SGregory Neil Shapiro ph_map_lookup, null_map_store); 5003299c2f1SGregory Neil Shapiro #endif /* PH_MAP */ 5013299c2f1SGregory Neil Shapiro 5023299c2f1SGregory Neil Shapiro #if MAP_NSD 5033299c2f1SGregory Neil Shapiro /* IRIX 6.5 nsd support */ 5043299c2f1SGregory Neil Shapiro MAPDEF("nsd", NULL, MCF_ALIASOK, 5053299c2f1SGregory Neil Shapiro map_parseargs, null_map_open, null_map_close, 5063299c2f1SGregory Neil Shapiro nsd_map_lookup, null_map_store); 5073299c2f1SGregory Neil Shapiro #endif /* MAP_NSD */ 508c2aa98e2SPeter Wemm 50912ed1c7cSGregory Neil Shapiro #if HESIOD 510c2aa98e2SPeter Wemm MAPDEF("hesiod", NULL, MCF_ALIASOK|MCF_ALIASONLY, 51112ed1c7cSGregory Neil Shapiro map_parseargs, hes_map_open, hes_map_close, 512c2aa98e2SPeter Wemm hes_map_lookup, null_map_store); 5133299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 514c2aa98e2SPeter Wemm 515c2aa98e2SPeter Wemm #if NETINFO 516c2aa98e2SPeter Wemm MAPDEF("netinfo", NULL, MCF_ALIASOK, 517c2aa98e2SPeter Wemm map_parseargs, ni_map_open, null_map_close, 518c2aa98e2SPeter Wemm ni_map_lookup, null_map_store); 5193299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 520c2aa98e2SPeter Wemm 521c2aa98e2SPeter Wemm #if 0 522c2aa98e2SPeter Wemm MAPDEF("dns", NULL, 0, 523c2aa98e2SPeter Wemm dns_map_init, null_map_open, null_map_close, 524c2aa98e2SPeter Wemm dns_map_lookup, null_map_store); 5253299c2f1SGregory Neil Shapiro #endif /* 0 */ 526c2aa98e2SPeter Wemm 527c2aa98e2SPeter Wemm #if NAMED_BIND 52812ed1c7cSGregory Neil Shapiro # if DNSMAP 529320f00e7SGregory Neil Shapiro # if _FFR_DNSMAP_ALIASABLE 530320f00e7SGregory Neil Shapiro MAPDEF("dns", NULL, MCF_ALIASOK, 531320f00e7SGregory Neil Shapiro dns_map_parseargs, dns_map_open, null_map_close, 532320f00e7SGregory Neil Shapiro dns_map_lookup, null_map_store); 533320f00e7SGregory Neil Shapiro # else /* _FFR_DNSMAP_ALIASABLE */ 53412ed1c7cSGregory Neil Shapiro MAPDEF("dns", NULL, 0, 53512ed1c7cSGregory Neil Shapiro dns_map_parseargs, dns_map_open, null_map_close, 53612ed1c7cSGregory Neil Shapiro dns_map_lookup, null_map_store); 537320f00e7SGregory Neil Shapiro # endif /* _FFR_DNSMAP_ALIASABLE */ 53812ed1c7cSGregory Neil Shapiro # endif /* DNSMAP */ 53912ed1c7cSGregory Neil Shapiro #endif /* NAMED_BIND */ 54012ed1c7cSGregory Neil Shapiro 54112ed1c7cSGregory Neil Shapiro #if NAMED_BIND 542c2aa98e2SPeter Wemm /* best MX DNS lookup */ 543c2aa98e2SPeter Wemm MAPDEF("bestmx", NULL, MCF_OPTFILE, 544c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 545c2aa98e2SPeter Wemm bestmx_map_lookup, null_map_store); 5463299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 547c2aa98e2SPeter Wemm 548c2aa98e2SPeter Wemm MAPDEF("host", NULL, 0, 549c2aa98e2SPeter Wemm host_map_init, null_map_open, null_map_close, 550c2aa98e2SPeter Wemm host_map_lookup, null_map_store); 551c2aa98e2SPeter Wemm 552c2aa98e2SPeter Wemm MAPDEF("text", NULL, MCF_ALIASOK, 553c2aa98e2SPeter Wemm map_parseargs, text_map_open, null_map_close, 554c2aa98e2SPeter Wemm text_map_lookup, null_map_store); 555c2aa98e2SPeter Wemm 556c2aa98e2SPeter Wemm MAPDEF("stab", NULL, MCF_ALIASOK|MCF_ALIASONLY, 557c2aa98e2SPeter Wemm map_parseargs, stab_map_open, null_map_close, 558c2aa98e2SPeter Wemm stab_map_lookup, stab_map_store); 559c2aa98e2SPeter Wemm 560c2aa98e2SPeter Wemm MAPDEF("implicit", NULL, MCF_ALIASOK|MCF_ALIASONLY|MCF_REBUILDABLE, 561c2aa98e2SPeter Wemm map_parseargs, impl_map_open, impl_map_close, 562c2aa98e2SPeter Wemm impl_map_lookup, impl_map_store); 563c2aa98e2SPeter Wemm 564c2aa98e2SPeter Wemm /* access to system passwd file */ 565c2aa98e2SPeter Wemm MAPDEF("user", NULL, MCF_OPTFILE, 566c2aa98e2SPeter Wemm map_parseargs, user_map_open, null_map_close, 567c2aa98e2SPeter Wemm user_map_lookup, null_map_store); 568c2aa98e2SPeter Wemm 569c2aa98e2SPeter Wemm /* dequote map */ 570c2aa98e2SPeter Wemm MAPDEF("dequote", NULL, 0, 571c2aa98e2SPeter Wemm dequote_init, null_map_open, null_map_close, 572c2aa98e2SPeter Wemm dequote_map, null_map_store); 573c2aa98e2SPeter Wemm 57412ed1c7cSGregory Neil Shapiro #if MAP_REGEX 575c2aa98e2SPeter Wemm MAPDEF("regex", NULL, 0, 576c2aa98e2SPeter Wemm regex_map_init, null_map_open, null_map_close, 577c2aa98e2SPeter Wemm regex_map_lookup, null_map_store); 5783299c2f1SGregory Neil Shapiro #endif /* MAP_REGEX */ 579c2aa98e2SPeter Wemm 580c2aa98e2SPeter Wemm #if USERDB 581c2aa98e2SPeter Wemm /* user database */ 582c2aa98e2SPeter Wemm MAPDEF("userdb", ".db", 0, 583c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 584c2aa98e2SPeter Wemm udb_map_lookup, null_map_store); 5853299c2f1SGregory Neil Shapiro #endif /* USERDB */ 586c2aa98e2SPeter Wemm 587c2aa98e2SPeter Wemm /* arbitrary programs */ 588c2aa98e2SPeter Wemm MAPDEF("program", NULL, MCF_ALIASOK, 589c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 590c2aa98e2SPeter Wemm prog_map_lookup, null_map_store); 591c2aa98e2SPeter Wemm 592c2aa98e2SPeter Wemm /* sequenced maps */ 593c2aa98e2SPeter Wemm MAPDEF("sequence", NULL, MCF_ALIASOK, 594c2aa98e2SPeter Wemm seq_map_parse, null_map_open, null_map_close, 595c2aa98e2SPeter Wemm seq_map_lookup, seq_map_store); 596c2aa98e2SPeter Wemm 597c2aa98e2SPeter Wemm /* switched interface to sequenced maps */ 598c2aa98e2SPeter Wemm MAPDEF("switch", NULL, MCF_ALIASOK, 599c2aa98e2SPeter Wemm map_parseargs, switch_map_open, null_map_close, 600c2aa98e2SPeter Wemm seq_map_lookup, seq_map_store); 601c2aa98e2SPeter Wemm 602c2aa98e2SPeter Wemm /* null map lookup -- really for internal use only */ 603c2aa98e2SPeter Wemm MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE, 604c2aa98e2SPeter Wemm map_parseargs, null_map_open, null_map_close, 605c2aa98e2SPeter Wemm null_map_lookup, null_map_store); 606c2aa98e2SPeter Wemm 607c2aa98e2SPeter Wemm /* syslog map -- logs information to syslog */ 608c2aa98e2SPeter Wemm MAPDEF("syslog", NULL, 0, 609c2aa98e2SPeter Wemm syslog_map_parseargs, null_map_open, null_map_close, 610c2aa98e2SPeter Wemm syslog_map_lookup, null_map_store); 6113299c2f1SGregory Neil Shapiro 6123299c2f1SGregory Neil Shapiro /* macro storage map -- rulesets can set macros */ 6133299c2f1SGregory Neil Shapiro MAPDEF("macro", NULL, 0, 6143299c2f1SGregory Neil Shapiro dequote_init, null_map_open, null_map_close, 6153299c2f1SGregory Neil Shapiro macro_map_lookup, null_map_store); 6163299c2f1SGregory Neil Shapiro 6173299c2f1SGregory Neil Shapiro /* arithmetic map -- add/subtract/compare */ 6183299c2f1SGregory Neil Shapiro MAPDEF("arith", NULL, 0, 6193299c2f1SGregory Neil Shapiro dequote_init, null_map_open, null_map_close, 6203299c2f1SGregory Neil Shapiro arith_map_lookup, null_map_store); 6213299c2f1SGregory Neil Shapiro 6223299c2f1SGregory Neil Shapiro if (tTd(38, 2)) 6233299c2f1SGregory Neil Shapiro { 6243299c2f1SGregory Neil Shapiro /* bogus map -- always return tempfail */ 6253299c2f1SGregory Neil Shapiro MAPDEF("bogus", NULL, MCF_ALIASOK|MCF_OPTFILE, 6263299c2f1SGregory Neil Shapiro map_parseargs, null_map_open, null_map_close, 6273299c2f1SGregory Neil Shapiro bogus_map_lookup, null_map_store); 6283299c2f1SGregory Neil Shapiro } 629c2aa98e2SPeter Wemm } 630c2aa98e2SPeter Wemm 631c2aa98e2SPeter Wemm #undef MAPDEF 63212ed1c7cSGregory Neil Shapiro /* 633c2aa98e2SPeter Wemm ** INITHOSTMAPS -- initial host-dependent maps 634c2aa98e2SPeter Wemm ** 635c2aa98e2SPeter Wemm ** This should act as an interface to any local service switch 636c2aa98e2SPeter Wemm ** provided by the host operating system. 637c2aa98e2SPeter Wemm ** 638c2aa98e2SPeter Wemm ** Parameters: 639c2aa98e2SPeter Wemm ** none 640c2aa98e2SPeter Wemm ** 641c2aa98e2SPeter Wemm ** Returns: 642c2aa98e2SPeter Wemm ** none 643c2aa98e2SPeter Wemm ** 644c2aa98e2SPeter Wemm ** Side Effects: 645c2aa98e2SPeter Wemm ** Should define maps "host" and "users" as necessary 646c2aa98e2SPeter Wemm ** for this OS. If they are not defined, they will get 647c2aa98e2SPeter Wemm ** a default value later. It should check to make sure 648c2aa98e2SPeter Wemm ** they are not defined first, since it's possible that 649c2aa98e2SPeter Wemm ** the config file has provided an override. 650c2aa98e2SPeter Wemm */ 651c2aa98e2SPeter Wemm 652c2aa98e2SPeter Wemm void 653c2aa98e2SPeter Wemm inithostmaps() 654c2aa98e2SPeter Wemm { 655c2aa98e2SPeter Wemm register int i; 656c2aa98e2SPeter Wemm int nmaps; 657c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 658c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 659c2aa98e2SPeter Wemm char buf[MAXLINE]; 660c2aa98e2SPeter Wemm 661c2aa98e2SPeter Wemm /* 662c2aa98e2SPeter Wemm ** Set up default hosts maps. 663c2aa98e2SPeter Wemm */ 664c2aa98e2SPeter Wemm 665c2aa98e2SPeter Wemm #if 0 666c2aa98e2SPeter Wemm nmaps = switch_map_find("hosts", maptype, mapreturn); 667c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 668c2aa98e2SPeter Wemm { 669c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 670c2aa98e2SPeter Wemm stab("hosts.files", ST_MAP, ST_FIND) == NULL) 671c2aa98e2SPeter Wemm { 67212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts", 6733299c2f1SGregory Neil Shapiro sizeof buf); 674c2aa98e2SPeter Wemm (void) makemapentry(buf); 675c2aa98e2SPeter Wemm } 676c2aa98e2SPeter Wemm # if NAMED_BIND 677c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "dns") == 0 && 678c2aa98e2SPeter Wemm stab("hosts.dns", ST_MAP, ST_FIND) == NULL) 679c2aa98e2SPeter Wemm { 68012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.dns dns A", sizeof buf); 681c2aa98e2SPeter Wemm (void) makemapentry(buf); 682c2aa98e2SPeter Wemm } 6833299c2f1SGregory Neil Shapiro # endif /* NAMED_BIND */ 68412ed1c7cSGregory Neil Shapiro # if NISPLUS 685c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 686c2aa98e2SPeter Wemm stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL) 687c2aa98e2SPeter Wemm { 68812ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.nisplus nisplus -k name -v address hosts.org_dir", 6893299c2f1SGregory Neil Shapiro sizeof buf); 690c2aa98e2SPeter Wemm (void) makemapentry(buf); 691c2aa98e2SPeter Wemm } 6923299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 69312ed1c7cSGregory Neil Shapiro # if NIS 694c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 695c2aa98e2SPeter Wemm stab("hosts.nis", ST_MAP, ST_FIND) == NULL) 696c2aa98e2SPeter Wemm { 69712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.nis nis -k 0 -v 1 hosts.byname", 6983299c2f1SGregory Neil Shapiro sizeof buf); 699c2aa98e2SPeter Wemm (void) makemapentry(buf); 700c2aa98e2SPeter Wemm } 7013299c2f1SGregory Neil Shapiro # endif /* NIS */ 702c2aa98e2SPeter Wemm # if NETINFO 70312ed1c7cSGregory Neil Shapiro else if (strcmp(maptype[i], "netinfo") == 0 && 704c2aa98e2SPeter Wemm stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL) 705c2aa98e2SPeter Wemm { 70612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "hosts.netinfo netinfo -v name /machines", 7073299c2f1SGregory Neil Shapiro sizeof buf); 708c2aa98e2SPeter Wemm (void) makemapentry(buf); 709c2aa98e2SPeter Wemm } 7103299c2f1SGregory Neil Shapiro # endif /* NETINFO */ 711c2aa98e2SPeter Wemm } 7123299c2f1SGregory Neil Shapiro #endif /* 0 */ 713c2aa98e2SPeter Wemm 714c2aa98e2SPeter Wemm /* 715c2aa98e2SPeter Wemm ** Make sure we have a host map. 716c2aa98e2SPeter Wemm */ 717c2aa98e2SPeter Wemm 718c2aa98e2SPeter Wemm if (stab("host", ST_MAP, ST_FIND) == NULL) 719c2aa98e2SPeter Wemm { 720c2aa98e2SPeter Wemm /* user didn't initialize: set up host map */ 72112ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "host host", sizeof buf); 722c2aa98e2SPeter Wemm #if NAMED_BIND 723c2aa98e2SPeter Wemm if (ConfigLevel >= 2) 72412ed1c7cSGregory Neil Shapiro (void) sm_strlcat(buf, " -a. -D", sizeof buf); 7253299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 726c2aa98e2SPeter Wemm (void) makemapentry(buf); 727c2aa98e2SPeter Wemm } 728c2aa98e2SPeter Wemm 729c2aa98e2SPeter Wemm /* 730c2aa98e2SPeter Wemm ** Set up default aliases maps 731c2aa98e2SPeter Wemm */ 732c2aa98e2SPeter Wemm 733c2aa98e2SPeter Wemm nmaps = switch_map_find("aliases", maptype, mapreturn); 734c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 735c2aa98e2SPeter Wemm { 736c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 737c2aa98e2SPeter Wemm stab("aliases.files", ST_MAP, ST_FIND) == NULL) 738c2aa98e2SPeter Wemm { 73912ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.files null", 74012ed1c7cSGregory Neil Shapiro sizeof buf); 741c2aa98e2SPeter Wemm (void) makemapentry(buf); 742c2aa98e2SPeter Wemm } 74312ed1c7cSGregory Neil Shapiro #if NISPLUS 744c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 745c2aa98e2SPeter Wemm stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL) 746c2aa98e2SPeter Wemm { 74712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion mail_aliases.org_dir", 7483299c2f1SGregory Neil Shapiro sizeof buf); 749c2aa98e2SPeter Wemm (void) makemapentry(buf); 750c2aa98e2SPeter Wemm } 7513299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 75212ed1c7cSGregory Neil Shapiro #if NIS 753c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 754c2aa98e2SPeter Wemm stab("aliases.nis", ST_MAP, ST_FIND) == NULL) 755c2aa98e2SPeter Wemm { 75612ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.nis nis mail.aliases", 7573299c2f1SGregory Neil Shapiro sizeof buf); 758c2aa98e2SPeter Wemm (void) makemapentry(buf); 759c2aa98e2SPeter Wemm } 7603299c2f1SGregory Neil Shapiro #endif /* NIS */ 7613299c2f1SGregory Neil Shapiro #if NETINFO 762c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "netinfo") == 0 && 763c2aa98e2SPeter Wemm stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL) 764c2aa98e2SPeter Wemm { 76512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.netinfo netinfo -z, /aliases", 7663299c2f1SGregory Neil Shapiro sizeof buf); 767c2aa98e2SPeter Wemm (void) makemapentry(buf); 768c2aa98e2SPeter Wemm } 7693299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 77012ed1c7cSGregory Neil Shapiro #if HESIOD 771c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "hesiod") == 0 && 772c2aa98e2SPeter Wemm stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL) 773c2aa98e2SPeter Wemm { 77412ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases.hesiod hesiod aliases", 7753299c2f1SGregory Neil Shapiro sizeof buf); 776c2aa98e2SPeter Wemm (void) makemapentry(buf); 777c2aa98e2SPeter Wemm } 7783299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 779c2aa98e2SPeter Wemm } 780c2aa98e2SPeter Wemm if (stab("aliases", ST_MAP, ST_FIND) == NULL) 781c2aa98e2SPeter Wemm { 78212ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "aliases switch aliases", sizeof buf); 783c2aa98e2SPeter Wemm (void) makemapentry(buf); 784c2aa98e2SPeter Wemm } 785c2aa98e2SPeter Wemm 786c2aa98e2SPeter Wemm #if 0 /* "user" map class is a better choice */ 787c2aa98e2SPeter Wemm /* 788c2aa98e2SPeter Wemm ** Set up default users maps. 789c2aa98e2SPeter Wemm */ 790c2aa98e2SPeter Wemm 791c2aa98e2SPeter Wemm nmaps = switch_map_find("passwd", maptype, mapreturn); 792c2aa98e2SPeter Wemm for (i = 0; i < nmaps; i++) 793c2aa98e2SPeter Wemm { 794c2aa98e2SPeter Wemm if (strcmp(maptype[i], "files") == 0 && 795c2aa98e2SPeter Wemm stab("users.files", ST_MAP, ST_FIND) == NULL) 796c2aa98e2SPeter Wemm { 79712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd", 7983299c2f1SGregory Neil Shapiro sizeof buf); 799c2aa98e2SPeter Wemm (void) makemapentry(buf); 800c2aa98e2SPeter Wemm } 80112ed1c7cSGregory Neil Shapiro # if NISPLUS 802c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nisplus") == 0 && 803c2aa98e2SPeter Wemm stab("users.nisplus", ST_MAP, ST_FIND) == NULL) 804c2aa98e2SPeter Wemm { 80512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.nisplus nisplus -m -kname -vhome passwd.org_dir", 8063299c2f1SGregory Neil Shapiro sizeof buf); 807c2aa98e2SPeter Wemm (void) makemapentry(buf); 808c2aa98e2SPeter Wemm } 8093299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 81012ed1c7cSGregory Neil Shapiro # if NIS 811c2aa98e2SPeter Wemm else if (strcmp(maptype[i], "nis") == 0 && 812c2aa98e2SPeter Wemm stab("users.nis", ST_MAP, ST_FIND) == NULL) 813c2aa98e2SPeter Wemm { 81412ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.nis nis -m passwd.byname", 8153299c2f1SGregory Neil Shapiro sizeof buf); 816c2aa98e2SPeter Wemm (void) makemapentry(buf); 817c2aa98e2SPeter Wemm } 8183299c2f1SGregory Neil Shapiro # endif /* NIS */ 81912ed1c7cSGregory Neil Shapiro # if HESIOD 82012ed1c7cSGregory Neil Shapiro else if (strcmp(maptype[i], "hesiod") == 0 && 821c2aa98e2SPeter Wemm stab("users.hesiod", ST_MAP, ST_FIND) == NULL) 822c2aa98e2SPeter Wemm { 82312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users.hesiod hesiod", sizeof buf); 824c2aa98e2SPeter Wemm (void) makemapentry(buf); 825c2aa98e2SPeter Wemm } 8263299c2f1SGregory Neil Shapiro # endif /* HESIOD */ 827c2aa98e2SPeter Wemm } 828c2aa98e2SPeter Wemm if (stab("users", ST_MAP, ST_FIND) == NULL) 829c2aa98e2SPeter Wemm { 83012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(buf, "users switch -m passwd", sizeof buf); 831c2aa98e2SPeter Wemm (void) makemapentry(buf); 832c2aa98e2SPeter Wemm } 8333299c2f1SGregory Neil Shapiro #endif /* 0 */ 834c2aa98e2SPeter Wemm } 83512ed1c7cSGregory Neil Shapiro /* 836c2aa98e2SPeter Wemm ** SWITCH_MAP_FIND -- find the list of types associated with a map 837c2aa98e2SPeter Wemm ** 838c2aa98e2SPeter Wemm ** This is the system-dependent interface to the service switch. 839c2aa98e2SPeter Wemm ** 840c2aa98e2SPeter Wemm ** Parameters: 841c2aa98e2SPeter Wemm ** service -- the name of the service of interest. 842c2aa98e2SPeter Wemm ** maptype -- an out-array of strings containing the types 843c2aa98e2SPeter Wemm ** of access to use for this service. There can 844c2aa98e2SPeter Wemm ** be at most MAXMAPSTACK types for a single service. 845c2aa98e2SPeter Wemm ** mapreturn -- an out-array of return information bitmaps 846c2aa98e2SPeter Wemm ** for the map. 847c2aa98e2SPeter Wemm ** 848c2aa98e2SPeter Wemm ** Returns: 849c2aa98e2SPeter Wemm ** The number of map types filled in, or -1 for failure. 8503299c2f1SGregory Neil Shapiro ** 8513299c2f1SGregory Neil Shapiro ** Side effects: 8523299c2f1SGregory Neil Shapiro ** Preserves errno so nothing in the routine clobbers it. 853c2aa98e2SPeter Wemm */ 854c2aa98e2SPeter Wemm 855c2aa98e2SPeter Wemm #if defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) 856c2aa98e2SPeter Wemm # define _USE_SUN_NSSWITCH_ 8573299c2f1SGregory Neil Shapiro #endif /* defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) */ 858c2aa98e2SPeter Wemm 85912ed1c7cSGregory Neil Shapiro #if _FFR_HPUX_NSSWITCH 86012ed1c7cSGregory Neil Shapiro # ifdef __hpux 86112ed1c7cSGregory Neil Shapiro # define _USE_SUN_NSSWITCH_ 86212ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 86312ed1c7cSGregory Neil Shapiro #endif /* _FFR_HPUX_NSSWITCH */ 86412ed1c7cSGregory Neil Shapiro 865c2aa98e2SPeter Wemm #ifdef _USE_SUN_NSSWITCH_ 866c2aa98e2SPeter Wemm # include <nsswitch.h> 8673299c2f1SGregory Neil Shapiro #endif /* _USE_SUN_NSSWITCH_ */ 868c2aa98e2SPeter Wemm 869c2aa98e2SPeter Wemm #if defined(ultrix) || (defined(__osf__) && defined(__alpha)) 870c2aa98e2SPeter Wemm # define _USE_DEC_SVC_CONF_ 8713299c2f1SGregory Neil Shapiro #endif /* defined(ultrix) || (defined(__osf__) && defined(__alpha)) */ 872c2aa98e2SPeter Wemm 873c2aa98e2SPeter Wemm #ifdef _USE_DEC_SVC_CONF_ 874c2aa98e2SPeter Wemm # include <sys/svcinfo.h> 8753299c2f1SGregory Neil Shapiro #endif /* _USE_DEC_SVC_CONF_ */ 876c2aa98e2SPeter Wemm 877c2aa98e2SPeter Wemm int 878c2aa98e2SPeter Wemm switch_map_find(service, maptype, mapreturn) 879c2aa98e2SPeter Wemm char *service; 880c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 881c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 882c2aa98e2SPeter Wemm { 883c46d91b7SGregory Neil Shapiro int svcno = 0; 8843299c2f1SGregory Neil Shapiro int save_errno = errno; 885c2aa98e2SPeter Wemm 886c2aa98e2SPeter Wemm #ifdef _USE_SUN_NSSWITCH_ 887c2aa98e2SPeter Wemm struct __nsw_switchconfig *nsw_conf; 888c2aa98e2SPeter Wemm enum __nsw_parse_err pserr; 889c2aa98e2SPeter Wemm struct __nsw_lookup *lk; 890c2aa98e2SPeter Wemm static struct __nsw_lookup lkp0 = 891c2aa98e2SPeter Wemm { "files", {1, 0, 0, 0}, NULL, NULL }; 892c2aa98e2SPeter Wemm static struct __nsw_switchconfig lkp_default = 893c2aa98e2SPeter Wemm { 0, "sendmail", 3, &lkp0 }; 894c2aa98e2SPeter Wemm 895c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 896c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 897c2aa98e2SPeter Wemm 898c2aa98e2SPeter Wemm if ((nsw_conf = __nsw_getconfig(service, &pserr)) == NULL) 899c2aa98e2SPeter Wemm lk = lkp_default.lookups; 900c2aa98e2SPeter Wemm else 901c2aa98e2SPeter Wemm lk = nsw_conf->lookups; 902c2aa98e2SPeter Wemm svcno = 0; 903c46d91b7SGregory Neil Shapiro while (lk != NULL && svcno < MAXMAPSTACK) 904c2aa98e2SPeter Wemm { 905c2aa98e2SPeter Wemm maptype[svcno] = lk->service_name; 906c2aa98e2SPeter Wemm if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN) 907c2aa98e2SPeter Wemm mapreturn[MA_NOTFOUND] |= 1 << svcno; 908c2aa98e2SPeter Wemm if (lk->actions[__NSW_TRYAGAIN] == __NSW_RETURN) 909c2aa98e2SPeter Wemm mapreturn[MA_TRYAGAIN] |= 1 << svcno; 910c2aa98e2SPeter Wemm if (lk->actions[__NSW_UNAVAIL] == __NSW_RETURN) 911c2aa98e2SPeter Wemm mapreturn[MA_TRYAGAIN] |= 1 << svcno; 912c2aa98e2SPeter Wemm svcno++; 913c2aa98e2SPeter Wemm lk = lk->next; 914c2aa98e2SPeter Wemm } 9153299c2f1SGregory Neil Shapiro errno = save_errno; 916c2aa98e2SPeter Wemm return svcno; 9173299c2f1SGregory Neil Shapiro #endif /* _USE_SUN_NSSWITCH_ */ 918c2aa98e2SPeter Wemm 919c2aa98e2SPeter Wemm #ifdef _USE_DEC_SVC_CONF_ 920c2aa98e2SPeter Wemm struct svcinfo *svcinfo; 921c2aa98e2SPeter Wemm int svc; 922c2aa98e2SPeter Wemm 923c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 924c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 925c2aa98e2SPeter Wemm 926c2aa98e2SPeter Wemm svcinfo = getsvc(); 927c2aa98e2SPeter Wemm if (svcinfo == NULL) 928c2aa98e2SPeter Wemm goto punt; 929c2aa98e2SPeter Wemm if (strcmp(service, "hosts") == 0) 930c2aa98e2SPeter Wemm svc = SVC_HOSTS; 931c2aa98e2SPeter Wemm else if (strcmp(service, "aliases") == 0) 932c2aa98e2SPeter Wemm svc = SVC_ALIASES; 933c2aa98e2SPeter Wemm else if (strcmp(service, "passwd") == 0) 934c2aa98e2SPeter Wemm svc = SVC_PASSWD; 935c2aa98e2SPeter Wemm else 9363299c2f1SGregory Neil Shapiro { 9373299c2f1SGregory Neil Shapiro errno = save_errno; 938c2aa98e2SPeter Wemm return -1; 9393299c2f1SGregory Neil Shapiro } 940c46d91b7SGregory Neil Shapiro for (svcno = 0; svcno < SVC_PATHSIZE && svcno < MAXMAPSTACK; svcno++) 941c2aa98e2SPeter Wemm { 942c2aa98e2SPeter Wemm switch (svcinfo->svcpath[svc][svcno]) 943c2aa98e2SPeter Wemm { 944c2aa98e2SPeter Wemm case SVC_LOCAL: 945c2aa98e2SPeter Wemm maptype[svcno] = "files"; 946c2aa98e2SPeter Wemm break; 947c2aa98e2SPeter Wemm 948c2aa98e2SPeter Wemm case SVC_YP: 949c2aa98e2SPeter Wemm maptype[svcno] = "nis"; 950c2aa98e2SPeter Wemm break; 951c2aa98e2SPeter Wemm 952c2aa98e2SPeter Wemm case SVC_BIND: 953c2aa98e2SPeter Wemm maptype[svcno] = "dns"; 954c2aa98e2SPeter Wemm break; 955c2aa98e2SPeter Wemm 956c2aa98e2SPeter Wemm # ifdef SVC_HESIOD 957c2aa98e2SPeter Wemm case SVC_HESIOD: 958c2aa98e2SPeter Wemm maptype[svcno] = "hesiod"; 959c2aa98e2SPeter Wemm break; 9603299c2f1SGregory Neil Shapiro # endif /* SVC_HESIOD */ 961c2aa98e2SPeter Wemm 962c2aa98e2SPeter Wemm case SVC_LAST: 9633299c2f1SGregory Neil Shapiro errno = save_errno; 964c2aa98e2SPeter Wemm return svcno; 965c2aa98e2SPeter Wemm } 966c2aa98e2SPeter Wemm } 9673299c2f1SGregory Neil Shapiro errno = save_errno; 968c2aa98e2SPeter Wemm return svcno; 9693299c2f1SGregory Neil Shapiro #endif /* _USE_DEC_SVC_CONF_ */ 970c2aa98e2SPeter Wemm 971c2aa98e2SPeter Wemm #if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) 972c2aa98e2SPeter Wemm /* 973c2aa98e2SPeter Wemm ** Fall-back mechanism. 974c2aa98e2SPeter Wemm */ 975c2aa98e2SPeter Wemm 976c2aa98e2SPeter Wemm STAB *st; 97712ed1c7cSGregory Neil Shapiro static time_t servicecachetime; /* time service switch was cached */ 978c2aa98e2SPeter Wemm time_t now = curtime(); 979c2aa98e2SPeter Wemm 980c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 981c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 982c2aa98e2SPeter Wemm 98312ed1c7cSGregory Neil Shapiro if ((now - servicecachetime) > (time_t) ServiceCacheMaxAge) 984c2aa98e2SPeter Wemm { 985c2aa98e2SPeter Wemm /* (re)read service switch */ 98612ed1c7cSGregory Neil Shapiro register SM_FILE_T *fp; 9873299c2f1SGregory Neil Shapiro long sff = SFF_REGONLY|SFF_OPENASROOT|SFF_NOLOCK; 988c2aa98e2SPeter Wemm 9893299c2f1SGregory Neil Shapiro if (!bitnset(DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR, 9903299c2f1SGregory Neil Shapiro DontBlameSendmail)) 991c2aa98e2SPeter Wemm sff |= SFF_NOWLINK; 992c2aa98e2SPeter Wemm 993c2aa98e2SPeter Wemm if (ConfigFileRead) 99412ed1c7cSGregory Neil Shapiro servicecachetime = now; 995c2aa98e2SPeter Wemm fp = safefopen(ServiceSwitchFile, O_RDONLY, 0, sff); 996c2aa98e2SPeter Wemm if (fp != NULL) 997c2aa98e2SPeter Wemm { 998c2aa98e2SPeter Wemm char buf[MAXLINE]; 999c2aa98e2SPeter Wemm 100012ed1c7cSGregory Neil Shapiro while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, 100112ed1c7cSGregory Neil Shapiro sizeof buf) != NULL) 1002c2aa98e2SPeter Wemm { 1003c2aa98e2SPeter Wemm register char *p; 1004c2aa98e2SPeter Wemm 1005c2aa98e2SPeter Wemm p = strpbrk(buf, "#\n"); 1006c2aa98e2SPeter Wemm if (p != NULL) 1007c2aa98e2SPeter Wemm *p = '\0'; 1008c2aa98e2SPeter Wemm p = strpbrk(buf, " \t"); 1009c2aa98e2SPeter Wemm if (p != NULL) 1010c2aa98e2SPeter Wemm *p++ = '\0'; 1011c2aa98e2SPeter Wemm if (buf[0] == '\0') 1012c2aa98e2SPeter Wemm continue; 101376b7bf71SPeter Wemm if (p == NULL) 101476b7bf71SPeter Wemm { 101576b7bf71SPeter Wemm sm_syslog(LOG_ERR, NOQID, 101676b7bf71SPeter Wemm "Bad line on %.100s: %.100s", 101776b7bf71SPeter Wemm ServiceSwitchFile, 101876b7bf71SPeter Wemm buf); 101976b7bf71SPeter Wemm continue; 102076b7bf71SPeter Wemm } 1021c2aa98e2SPeter Wemm while (isspace(*p)) 1022c2aa98e2SPeter Wemm p++; 1023c2aa98e2SPeter Wemm if (*p == '\0') 1024c2aa98e2SPeter Wemm continue; 1025c2aa98e2SPeter Wemm 1026c2aa98e2SPeter Wemm /* 1027c2aa98e2SPeter Wemm ** Find/allocate space for this service entry. 1028c2aa98e2SPeter Wemm ** Space for all of the service strings 1029c2aa98e2SPeter Wemm ** are allocated at once. This means 1030c2aa98e2SPeter Wemm ** that we only have to free the first 1031c2aa98e2SPeter Wemm ** one to free all of them. 1032c2aa98e2SPeter Wemm */ 1033c2aa98e2SPeter Wemm 1034c2aa98e2SPeter Wemm st = stab(buf, ST_SERVICE, ST_ENTER); 1035c2aa98e2SPeter Wemm if (st->s_service[0] != NULL) 103612ed1c7cSGregory Neil Shapiro sm_free((void *) st->s_service[0]); /* XXX */ 1037c2aa98e2SPeter Wemm p = newstr(p); 1038c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPSTACK; ) 1039c2aa98e2SPeter Wemm { 1040c2aa98e2SPeter Wemm if (*p == '\0') 1041c2aa98e2SPeter Wemm break; 1042c2aa98e2SPeter Wemm st->s_service[svcno++] = p; 1043c2aa98e2SPeter Wemm p = strpbrk(p, " \t"); 1044c2aa98e2SPeter Wemm if (p == NULL) 1045c2aa98e2SPeter Wemm break; 1046c2aa98e2SPeter Wemm *p++ = '\0'; 1047c2aa98e2SPeter Wemm while (isspace(*p)) 1048c2aa98e2SPeter Wemm p++; 1049c2aa98e2SPeter Wemm } 1050c2aa98e2SPeter Wemm if (svcno < MAXMAPSTACK) 1051c2aa98e2SPeter Wemm st->s_service[svcno] = NULL; 1052c2aa98e2SPeter Wemm } 105312ed1c7cSGregory Neil Shapiro (void) sm_io_close(fp, SM_TIME_DEFAULT); 1054c2aa98e2SPeter Wemm } 1055c2aa98e2SPeter Wemm } 1056c2aa98e2SPeter Wemm 1057c2aa98e2SPeter Wemm /* look up entry in cache */ 1058c2aa98e2SPeter Wemm st = stab(service, ST_SERVICE, ST_FIND); 1059c2aa98e2SPeter Wemm if (st != NULL && st->s_service[0] != NULL) 1060c2aa98e2SPeter Wemm { 1061c2aa98e2SPeter Wemm /* extract data */ 1062c2aa98e2SPeter Wemm svcno = 0; 1063c2aa98e2SPeter Wemm while (svcno < MAXMAPSTACK) 1064c2aa98e2SPeter Wemm { 1065c2aa98e2SPeter Wemm maptype[svcno] = st->s_service[svcno]; 1066c2aa98e2SPeter Wemm if (maptype[svcno++] == NULL) 1067c2aa98e2SPeter Wemm break; 1068c2aa98e2SPeter Wemm } 10693299c2f1SGregory Neil Shapiro errno = save_errno; 1070c2aa98e2SPeter Wemm return --svcno; 1071c2aa98e2SPeter Wemm } 10723299c2f1SGregory Neil Shapiro #endif /* !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) */ 1073c2aa98e2SPeter Wemm 1074c2aa98e2SPeter Wemm #if !defined(_USE_SUN_NSSWITCH_) 1075c2aa98e2SPeter Wemm /* if the service file doesn't work, use an absolute fallback */ 1076c2aa98e2SPeter Wemm # ifdef _USE_DEC_SVC_CONF_ 1077c2aa98e2SPeter Wemm punt: 10783299c2f1SGregory Neil Shapiro # endif /* _USE_DEC_SVC_CONF_ */ 1079c2aa98e2SPeter Wemm for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) 1080c2aa98e2SPeter Wemm mapreturn[svcno] = 0; 1081c2aa98e2SPeter Wemm svcno = 0; 1082c2aa98e2SPeter Wemm if (strcmp(service, "aliases") == 0) 1083c2aa98e2SPeter Wemm { 1084c2aa98e2SPeter Wemm maptype[svcno++] = "files"; 10853299c2f1SGregory Neil Shapiro # if defined(AUTO_NETINFO_ALIASES) && defined (NETINFO) 10863299c2f1SGregory Neil Shapiro maptype[svcno++] = "netinfo"; 10873299c2f1SGregory Neil Shapiro # endif /* defined(AUTO_NETINFO_ALIASES) && defined (NETINFO) */ 1088c2aa98e2SPeter Wemm # ifdef AUTO_NIS_ALIASES 108912ed1c7cSGregory Neil Shapiro # if NISPLUS 1090c2aa98e2SPeter Wemm maptype[svcno++] = "nisplus"; 10913299c2f1SGregory Neil Shapiro # endif /* NISPLUS */ 109212ed1c7cSGregory Neil Shapiro # if NIS 1093c2aa98e2SPeter Wemm maptype[svcno++] = "nis"; 10943299c2f1SGregory Neil Shapiro # endif /* NIS */ 10953299c2f1SGregory Neil Shapiro # endif /* AUTO_NIS_ALIASES */ 10963299c2f1SGregory Neil Shapiro errno = save_errno; 1097c2aa98e2SPeter Wemm return svcno; 1098c2aa98e2SPeter Wemm } 1099c2aa98e2SPeter Wemm if (strcmp(service, "hosts") == 0) 1100c2aa98e2SPeter Wemm { 1101c2aa98e2SPeter Wemm # if NAMED_BIND 1102c2aa98e2SPeter Wemm maptype[svcno++] = "dns"; 11033299c2f1SGregory Neil Shapiro # else /* NAMED_BIND */ 1104c2aa98e2SPeter Wemm # if defined(sun) && !defined(BSD) 1105c2aa98e2SPeter Wemm /* SunOS */ 1106c2aa98e2SPeter Wemm maptype[svcno++] = "nis"; 11073299c2f1SGregory Neil Shapiro # endif /* defined(sun) && !defined(BSD) */ 11083299c2f1SGregory Neil Shapiro # endif /* NAMED_BIND */ 11093299c2f1SGregory Neil Shapiro # if defined(AUTO_NETINFO_HOSTS) && defined (NETINFO) 11103299c2f1SGregory Neil Shapiro maptype[svcno++] = "netinfo"; 11113299c2f1SGregory Neil Shapiro # endif /* defined(AUTO_NETINFO_HOSTS) && defined (NETINFO) */ 1112c2aa98e2SPeter Wemm maptype[svcno++] = "files"; 11133299c2f1SGregory Neil Shapiro errno = save_errno; 1114c2aa98e2SPeter Wemm return svcno; 1115c2aa98e2SPeter Wemm } 11163299c2f1SGregory Neil Shapiro errno = save_errno; 1117c2aa98e2SPeter Wemm return -1; 11183299c2f1SGregory Neil Shapiro #endif /* !defined(_USE_SUN_NSSWITCH_) */ 1119c2aa98e2SPeter Wemm } 112012ed1c7cSGregory Neil Shapiro /* 1121c2aa98e2SPeter Wemm ** USERNAME -- return the user id of the logged in user. 1122c2aa98e2SPeter Wemm ** 1123c2aa98e2SPeter Wemm ** Parameters: 1124c2aa98e2SPeter Wemm ** none. 1125c2aa98e2SPeter Wemm ** 1126c2aa98e2SPeter Wemm ** Returns: 1127c2aa98e2SPeter Wemm ** The login name of the logged in user. 1128c2aa98e2SPeter Wemm ** 1129c2aa98e2SPeter Wemm ** Side Effects: 1130c2aa98e2SPeter Wemm ** none. 1131c2aa98e2SPeter Wemm ** 1132c2aa98e2SPeter Wemm ** Notes: 1133c2aa98e2SPeter Wemm ** The return value is statically allocated. 1134c2aa98e2SPeter Wemm */ 1135c2aa98e2SPeter Wemm 1136c2aa98e2SPeter Wemm char * 1137c2aa98e2SPeter Wemm username() 1138c2aa98e2SPeter Wemm { 1139c2aa98e2SPeter Wemm static char *myname = NULL; 1140c2aa98e2SPeter Wemm extern char *getlogin(); 1141c2aa98e2SPeter Wemm register struct passwd *pw; 1142c2aa98e2SPeter Wemm 1143c2aa98e2SPeter Wemm /* cache the result */ 1144c2aa98e2SPeter Wemm if (myname == NULL) 1145c2aa98e2SPeter Wemm { 1146c2aa98e2SPeter Wemm myname = getlogin(); 1147c2aa98e2SPeter Wemm if (myname == NULL || myname[0] == '\0') 1148c2aa98e2SPeter Wemm { 1149c2aa98e2SPeter Wemm pw = sm_getpwuid(RealUid); 1150c2aa98e2SPeter Wemm if (pw != NULL) 115112ed1c7cSGregory Neil Shapiro myname = pw->pw_name; 1152c2aa98e2SPeter Wemm } 1153c2aa98e2SPeter Wemm else 1154c2aa98e2SPeter Wemm { 1155c2aa98e2SPeter Wemm uid_t uid = RealUid; 1156c2aa98e2SPeter Wemm 1157c2aa98e2SPeter Wemm if ((pw = sm_getpwnam(myname)) == NULL || 1158c2aa98e2SPeter Wemm (uid != 0 && uid != pw->pw_uid)) 1159c2aa98e2SPeter Wemm { 1160c2aa98e2SPeter Wemm pw = sm_getpwuid(uid); 1161c2aa98e2SPeter Wemm if (pw != NULL) 116212ed1c7cSGregory Neil Shapiro myname = pw->pw_name; 1163c2aa98e2SPeter Wemm } 1164c2aa98e2SPeter Wemm } 1165c2aa98e2SPeter Wemm if (myname == NULL || myname[0] == '\0') 1166c2aa98e2SPeter Wemm { 11673299c2f1SGregory Neil Shapiro syserr("554 5.3.0 Who are you?"); 1168c2aa98e2SPeter Wemm myname = "postmaster"; 1169c2aa98e2SPeter Wemm } 117012ed1c7cSGregory Neil Shapiro else if (strpbrk(myname, ",;:/|\"\\") != NULL) 117112ed1c7cSGregory Neil Shapiro myname = addquotes(myname, NULL); 117212ed1c7cSGregory Neil Shapiro else 117312ed1c7cSGregory Neil Shapiro myname = sm_pstrdup_x(myname); 1174c2aa98e2SPeter Wemm } 11753299c2f1SGregory Neil Shapiro return myname; 1176c2aa98e2SPeter Wemm } 117712ed1c7cSGregory Neil Shapiro /* 1178c2aa98e2SPeter Wemm ** TTYPATH -- Get the path of the user's tty 1179c2aa98e2SPeter Wemm ** 1180c2aa98e2SPeter Wemm ** Returns the pathname of the user's tty. Returns NULL if 1181c2aa98e2SPeter Wemm ** the user is not logged in or if s/he has write permission 1182c2aa98e2SPeter Wemm ** denied. 1183c2aa98e2SPeter Wemm ** 1184c2aa98e2SPeter Wemm ** Parameters: 1185c2aa98e2SPeter Wemm ** none 1186c2aa98e2SPeter Wemm ** 1187c2aa98e2SPeter Wemm ** Returns: 1188c2aa98e2SPeter Wemm ** pathname of the user's tty. 1189c2aa98e2SPeter Wemm ** NULL if not logged in or write permission denied. 1190c2aa98e2SPeter Wemm ** 1191c2aa98e2SPeter Wemm ** Side Effects: 1192c2aa98e2SPeter Wemm ** none. 1193c2aa98e2SPeter Wemm ** 1194c2aa98e2SPeter Wemm ** WARNING: 1195c2aa98e2SPeter Wemm ** Return value is in a local buffer. 1196c2aa98e2SPeter Wemm ** 1197c2aa98e2SPeter Wemm ** Called By: 1198c2aa98e2SPeter Wemm ** savemail 1199c2aa98e2SPeter Wemm */ 1200c2aa98e2SPeter Wemm 1201c2aa98e2SPeter Wemm char * 1202c2aa98e2SPeter Wemm ttypath() 1203c2aa98e2SPeter Wemm { 1204c2aa98e2SPeter Wemm struct stat stbuf; 1205c2aa98e2SPeter Wemm register char *pathn; 1206c2aa98e2SPeter Wemm extern char *ttyname(); 1207c2aa98e2SPeter Wemm extern char *getlogin(); 1208c2aa98e2SPeter Wemm 1209c2aa98e2SPeter Wemm /* compute the pathname of the controlling tty */ 1210c2aa98e2SPeter Wemm if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL && 1211c2aa98e2SPeter Wemm (pathn = ttyname(0)) == NULL) 1212c2aa98e2SPeter Wemm { 1213c2aa98e2SPeter Wemm errno = 0; 12143299c2f1SGregory Neil Shapiro return NULL; 1215c2aa98e2SPeter Wemm } 1216c2aa98e2SPeter Wemm 1217c2aa98e2SPeter Wemm /* see if we have write permission */ 1218c2aa98e2SPeter Wemm if (stat(pathn, &stbuf) < 0 || !bitset(S_IWOTH, stbuf.st_mode)) 1219c2aa98e2SPeter Wemm { 1220c2aa98e2SPeter Wemm errno = 0; 12213299c2f1SGregory Neil Shapiro return NULL; 1222c2aa98e2SPeter Wemm } 1223c2aa98e2SPeter Wemm 1224c2aa98e2SPeter Wemm /* see if the user is logged in */ 1225c2aa98e2SPeter Wemm if (getlogin() == NULL) 12263299c2f1SGregory Neil Shapiro return NULL; 1227c2aa98e2SPeter Wemm 1228c2aa98e2SPeter Wemm /* looks good */ 12293299c2f1SGregory Neil Shapiro return pathn; 1230c2aa98e2SPeter Wemm } 123112ed1c7cSGregory Neil Shapiro /* 1232c2aa98e2SPeter Wemm ** CHECKCOMPAT -- check for From and To person compatible. 1233c2aa98e2SPeter Wemm ** 1234c2aa98e2SPeter Wemm ** This routine can be supplied on a per-installation basis 1235c2aa98e2SPeter Wemm ** to determine whether a person is allowed to send a message. 1236c2aa98e2SPeter Wemm ** This allows restriction of certain types of internet 1237c2aa98e2SPeter Wemm ** forwarding or registration of users. 1238c2aa98e2SPeter Wemm ** 1239c2aa98e2SPeter Wemm ** If the hosts are found to be incompatible, an error 1240c2aa98e2SPeter Wemm ** message should be given using "usrerr" and an EX_ code 1241c2aa98e2SPeter Wemm ** should be returned. You can also set to->q_status to 1242c2aa98e2SPeter Wemm ** a DSN-style status code. 1243c2aa98e2SPeter Wemm ** 1244c2aa98e2SPeter Wemm ** EF_NO_BODY_RETN can be set in e->e_flags to suppress the 1245c2aa98e2SPeter Wemm ** body during the return-to-sender function; this should be done 1246c2aa98e2SPeter Wemm ** on huge messages. This bit may already be set by the ESMTP 1247c2aa98e2SPeter Wemm ** protocol. 1248c2aa98e2SPeter Wemm ** 1249c2aa98e2SPeter Wemm ** Parameters: 1250c2aa98e2SPeter Wemm ** to -- the person being sent to. 1251c2aa98e2SPeter Wemm ** 1252c2aa98e2SPeter Wemm ** Returns: 1253c2aa98e2SPeter Wemm ** an exit status 1254c2aa98e2SPeter Wemm ** 1255c2aa98e2SPeter Wemm ** Side Effects: 1256c2aa98e2SPeter Wemm ** none (unless you include the usrerr stuff) 1257c2aa98e2SPeter Wemm */ 1258c2aa98e2SPeter Wemm 1259c2aa98e2SPeter Wemm int 1260c2aa98e2SPeter Wemm checkcompat(to, e) 1261c2aa98e2SPeter Wemm register ADDRESS *to; 1262c2aa98e2SPeter Wemm register ENVELOPE *e; 1263c2aa98e2SPeter Wemm { 1264c2aa98e2SPeter Wemm if (tTd(49, 1)) 126512ed1c7cSGregory Neil Shapiro sm_dprintf("checkcompat(to=%s, from=%s)\n", 1266c2aa98e2SPeter Wemm to->q_paddr, e->e_from.q_paddr); 1267c2aa98e2SPeter Wemm 1268c2aa98e2SPeter Wemm #ifdef EXAMPLE_CODE 1269c2aa98e2SPeter Wemm /* this code is intended as an example only */ 1270c2aa98e2SPeter Wemm register STAB *s; 1271c2aa98e2SPeter Wemm 1272c2aa98e2SPeter Wemm s = stab("arpa", ST_MAILER, ST_FIND); 1273c2aa98e2SPeter Wemm if (s != NULL && strcmp(e->e_from.q_mailer->m_name, "local") != 0 && 1274c2aa98e2SPeter Wemm to->q_mailer == s->s_mailer) 1275c2aa98e2SPeter Wemm { 1276c2aa98e2SPeter Wemm usrerr("553 No ARPA mail through this machine: see your system administration"); 12773299c2f1SGregory Neil Shapiro /* e->e_flags |= EF_NO_BODY_RETN; to suppress body on return */ 1278c2aa98e2SPeter Wemm to->q_status = "5.7.1"; 12793299c2f1SGregory Neil Shapiro return EX_UNAVAILABLE; 1280c2aa98e2SPeter Wemm } 1281c2aa98e2SPeter Wemm #endif /* EXAMPLE_CODE */ 12823299c2f1SGregory Neil Shapiro return EX_OK; 1283c2aa98e2SPeter Wemm } 12843299c2f1SGregory Neil Shapiro /* 1285c2aa98e2SPeter Wemm ** INIT_MD -- do machine dependent initializations 1286c2aa98e2SPeter Wemm ** 1287c2aa98e2SPeter Wemm ** Systems that have global modes that should be set should do 1288c2aa98e2SPeter Wemm ** them here rather than in main. 1289c2aa98e2SPeter Wemm */ 1290c2aa98e2SPeter Wemm 1291c2aa98e2SPeter Wemm #ifdef _AUX_SOURCE 1292c2aa98e2SPeter Wemm # include <compat.h> 12933299c2f1SGregory Neil Shapiro #endif /* _AUX_SOURCE */ 1294c2aa98e2SPeter Wemm 1295c2aa98e2SPeter Wemm #if SHARE_V1 1296c2aa98e2SPeter Wemm # include <shares.h> 12973299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 1298c2aa98e2SPeter Wemm 1299c2aa98e2SPeter Wemm void 1300c2aa98e2SPeter Wemm init_md(argc, argv) 1301c2aa98e2SPeter Wemm int argc; 1302c2aa98e2SPeter Wemm char **argv; 1303c2aa98e2SPeter Wemm { 1304c2aa98e2SPeter Wemm #ifdef _AUX_SOURCE 1305c2aa98e2SPeter Wemm setcompat(getcompat() | COMPAT_BSDPROT); 13063299c2f1SGregory Neil Shapiro #endif /* _AUX_SOURCE */ 1307c2aa98e2SPeter Wemm 1308c2aa98e2SPeter Wemm #ifdef SUN_EXTENSIONS 1309c2aa98e2SPeter Wemm init_md_sun(); 13103299c2f1SGregory Neil Shapiro #endif /* SUN_EXTENSIONS */ 1311c2aa98e2SPeter Wemm 1312c2aa98e2SPeter Wemm #if _CONVEX_SOURCE 1313c2aa98e2SPeter Wemm /* keep gethostby*() from stripping the local domain name */ 1314c2aa98e2SPeter Wemm set_domain_trim_off(); 13153299c2f1SGregory Neil Shapiro #endif /* _CONVEX_SOURCE */ 1316c2aa98e2SPeter Wemm #ifdef __QNX__ 1317c2aa98e2SPeter Wemm /* 1318c2aa98e2SPeter Wemm ** Due to QNX's network distributed nature, you can target a tcpip 1319c2aa98e2SPeter Wemm ** stack on a different node in the qnx network; this patch lets 1320c2aa98e2SPeter Wemm ** this feature work. The __sock_locate() must be done before the 1321c2aa98e2SPeter Wemm ** environment is clear. 1322c2aa98e2SPeter Wemm */ 1323c2aa98e2SPeter Wemm __sock_locate(); 13243299c2f1SGregory Neil Shapiro #endif /* __QNX__ */ 1325c2aa98e2SPeter Wemm #if SECUREWARE || defined(_SCO_unix_) 1326c2aa98e2SPeter Wemm set_auth_parameters(argc, argv); 1327c2aa98e2SPeter Wemm 1328c2aa98e2SPeter Wemm # ifdef _SCO_unix_ 1329c2aa98e2SPeter Wemm /* 1330c2aa98e2SPeter Wemm ** This is required for highest security levels (the kernel 1331c2aa98e2SPeter Wemm ** won't let it call set*uid() or run setuid binaries without 1332c2aa98e2SPeter Wemm ** it). It may be necessary on other SECUREWARE systems. 1333c2aa98e2SPeter Wemm */ 1334c2aa98e2SPeter Wemm 1335c2aa98e2SPeter Wemm if (getluid() == -1) 1336c2aa98e2SPeter Wemm setluid(0); 13373299c2f1SGregory Neil Shapiro # endif /* _SCO_unix_ */ 13383299c2f1SGregory Neil Shapiro #endif /* SECUREWARE || defined(_SCO_unix_) */ 13393299c2f1SGregory Neil Shapiro 1340c2aa98e2SPeter Wemm 1341c2aa98e2SPeter Wemm #ifdef VENDOR_DEFAULT 1342c2aa98e2SPeter Wemm VendorCode = VENDOR_DEFAULT; 13433299c2f1SGregory Neil Shapiro #else /* VENDOR_DEFAULT */ 1344c2aa98e2SPeter Wemm VendorCode = VENDOR_BERKELEY; 13453299c2f1SGregory Neil Shapiro #endif /* VENDOR_DEFAULT */ 1346c2aa98e2SPeter Wemm } 134712ed1c7cSGregory Neil Shapiro /* 1348c2aa98e2SPeter Wemm ** INIT_VENDOR_MACROS -- vendor-dependent macro initializations 1349c2aa98e2SPeter Wemm ** 1350c2aa98e2SPeter Wemm ** Called once, on startup. 1351c2aa98e2SPeter Wemm ** 1352c2aa98e2SPeter Wemm ** Parameters: 1353c2aa98e2SPeter Wemm ** e -- the global envelope. 1354c2aa98e2SPeter Wemm ** 1355c2aa98e2SPeter Wemm ** Returns: 1356c2aa98e2SPeter Wemm ** none. 1357c2aa98e2SPeter Wemm ** 1358c2aa98e2SPeter Wemm ** Side Effects: 1359c2aa98e2SPeter Wemm ** vendor-dependent. 1360c2aa98e2SPeter Wemm */ 1361c2aa98e2SPeter Wemm 1362c2aa98e2SPeter Wemm void 1363c2aa98e2SPeter Wemm init_vendor_macros(e) 1364c2aa98e2SPeter Wemm register ENVELOPE *e; 1365c2aa98e2SPeter Wemm { 1366c2aa98e2SPeter Wemm } 136712ed1c7cSGregory Neil Shapiro /* 1368c2aa98e2SPeter Wemm ** GETLA -- get the current load average 1369c2aa98e2SPeter Wemm ** 1370c2aa98e2SPeter Wemm ** This code stolen from la.c. 1371c2aa98e2SPeter Wemm ** 1372c2aa98e2SPeter Wemm ** Parameters: 1373c2aa98e2SPeter Wemm ** none. 1374c2aa98e2SPeter Wemm ** 1375c2aa98e2SPeter Wemm ** Returns: 1376c2aa98e2SPeter Wemm ** The current load average as an integer. 1377c2aa98e2SPeter Wemm ** 1378c2aa98e2SPeter Wemm ** Side Effects: 1379c2aa98e2SPeter Wemm ** none. 1380c2aa98e2SPeter Wemm */ 1381c2aa98e2SPeter Wemm 1382c2aa98e2SPeter Wemm /* try to guess what style of load average we have */ 1383c2aa98e2SPeter Wemm #define LA_ZERO 1 /* always return load average as zero */ 1384c2aa98e2SPeter Wemm #define LA_INT 2 /* read kmem for avenrun; interpret as long */ 1385c2aa98e2SPeter Wemm #define LA_FLOAT 3 /* read kmem for avenrun; interpret as float */ 1386c2aa98e2SPeter Wemm #define LA_SUBR 4 /* call getloadavg */ 1387c2aa98e2SPeter Wemm #define LA_MACH 5 /* MACH load averages (as on NeXT boxes) */ 1388c2aa98e2SPeter Wemm #define LA_SHORT 6 /* read kmem for avenrun; interpret as short */ 1389c2aa98e2SPeter Wemm #define LA_PROCSTR 7 /* read string ("1.17") from /proc/loadavg */ 1390c2aa98e2SPeter Wemm #define LA_READKSYM 8 /* SVR4: use MIOC_READKSYM ioctl call */ 1391c2aa98e2SPeter Wemm #define LA_DGUX 9 /* special DGUX implementation */ 1392c2aa98e2SPeter Wemm #define LA_HPUX 10 /* special HPUX implementation */ 1393c2aa98e2SPeter Wemm #define LA_IRIX6 11 /* special IRIX 6.2 implementation */ 1394c2aa98e2SPeter Wemm #define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */ 1395c2aa98e2SPeter Wemm #define LA_DEVSHORT 13 /* read short from a device */ 1396c2aa98e2SPeter Wemm #define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */ 1397c46d91b7SGregory Neil Shapiro #define LA_PSET 15 /* Solaris per-processor-set load average */ 1398c2aa98e2SPeter Wemm 1399c2aa98e2SPeter Wemm /* do guesses based on general OS type */ 1400c2aa98e2SPeter Wemm #ifndef LA_TYPE 1401c2aa98e2SPeter Wemm # define LA_TYPE LA_ZERO 14023299c2f1SGregory Neil Shapiro #endif /* ! LA_TYPE */ 1403c2aa98e2SPeter Wemm 1404c2aa98e2SPeter Wemm #ifndef FSHIFT 1405c2aa98e2SPeter Wemm # if defined(unixpc) 1406c2aa98e2SPeter Wemm # define FSHIFT 5 14073299c2f1SGregory Neil Shapiro # endif /* defined(unixpc) */ 1408c2aa98e2SPeter Wemm 1409c2aa98e2SPeter Wemm # if defined(__alpha) || defined(IRIX) 1410c2aa98e2SPeter Wemm # define FSHIFT 10 14113299c2f1SGregory Neil Shapiro # endif /* defined(__alpha) || defined(IRIX) */ 1412c2aa98e2SPeter Wemm 14133299c2f1SGregory Neil Shapiro #endif /* ! FSHIFT */ 1414c2aa98e2SPeter Wemm 1415c2aa98e2SPeter Wemm #ifndef FSHIFT 1416c2aa98e2SPeter Wemm # define FSHIFT 8 14173299c2f1SGregory Neil Shapiro #endif /* ! FSHIFT */ 1418c2aa98e2SPeter Wemm 1419c2aa98e2SPeter Wemm #ifndef FSCALE 1420c2aa98e2SPeter Wemm # define FSCALE (1 << FSHIFT) 14213299c2f1SGregory Neil Shapiro #endif /* ! FSCALE */ 1422c2aa98e2SPeter Wemm 1423c2aa98e2SPeter Wemm #ifndef LA_AVENRUN 1424c2aa98e2SPeter Wemm # ifdef SYSTEM5 1425c2aa98e2SPeter Wemm # define LA_AVENRUN "avenrun" 14263299c2f1SGregory Neil Shapiro # else /* SYSTEM5 */ 1427c2aa98e2SPeter Wemm # define LA_AVENRUN "_avenrun" 14283299c2f1SGregory Neil Shapiro # endif /* SYSTEM5 */ 14293299c2f1SGregory Neil Shapiro #endif /* ! LA_AVENRUN */ 1430c2aa98e2SPeter Wemm 1431c2aa98e2SPeter Wemm /* _PATH_KMEM should be defined in <paths.h> */ 1432c2aa98e2SPeter Wemm #ifndef _PATH_KMEM 1433c2aa98e2SPeter Wemm # define _PATH_KMEM "/dev/kmem" 14343299c2f1SGregory Neil Shapiro #endif /* ! _PATH_KMEM */ 1435c2aa98e2SPeter Wemm 1436c2aa98e2SPeter Wemm #if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) 1437c2aa98e2SPeter Wemm 1438c2aa98e2SPeter Wemm # include <nlist.h> 1439c2aa98e2SPeter Wemm 1440c2aa98e2SPeter Wemm /* _PATH_UNIX should be defined in <paths.h> */ 1441c2aa98e2SPeter Wemm # ifndef _PATH_UNIX 1442c2aa98e2SPeter Wemm # if defined(SYSTEM5) 1443c2aa98e2SPeter Wemm # define _PATH_UNIX "/unix" 14443299c2f1SGregory Neil Shapiro # else /* defined(SYSTEM5) */ 1445c2aa98e2SPeter Wemm # define _PATH_UNIX "/vmunix" 14463299c2f1SGregory Neil Shapiro # endif /* defined(SYSTEM5) */ 14473299c2f1SGregory Neil Shapiro # endif /* ! _PATH_UNIX */ 1448c2aa98e2SPeter Wemm 1449c2aa98e2SPeter Wemm # ifdef _AUX_SOURCE 1450c2aa98e2SPeter Wemm struct nlist Nl[2]; 14513299c2f1SGregory Neil Shapiro # else /* _AUX_SOURCE */ 1452c2aa98e2SPeter Wemm struct nlist Nl[] = 1453c2aa98e2SPeter Wemm { 1454c2aa98e2SPeter Wemm { LA_AVENRUN }, 1455c2aa98e2SPeter Wemm { 0 }, 1456c2aa98e2SPeter Wemm }; 14573299c2f1SGregory Neil Shapiro # endif /* _AUX_SOURCE */ 1458c2aa98e2SPeter Wemm # define X_AVENRUN 0 1459c2aa98e2SPeter Wemm 146012ed1c7cSGregory Neil Shapiro int 1461c2aa98e2SPeter Wemm getla() 1462c2aa98e2SPeter Wemm { 146312ed1c7cSGregory Neil Shapiro int j; 1464c2aa98e2SPeter Wemm static int kmem = -1; 1465c2aa98e2SPeter Wemm # if LA_TYPE == LA_INT 1466c2aa98e2SPeter Wemm long avenrun[3]; 14673299c2f1SGregory Neil Shapiro # else /* LA_TYPE == LA_INT */ 1468c2aa98e2SPeter Wemm # if LA_TYPE == LA_SHORT 1469c2aa98e2SPeter Wemm short avenrun[3]; 14703299c2f1SGregory Neil Shapiro # else /* LA_TYPE == LA_SHORT */ 1471c2aa98e2SPeter Wemm double avenrun[3]; 14723299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_SHORT */ 14733299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_INT */ 1474c2aa98e2SPeter Wemm extern int errno; 1475c2aa98e2SPeter Wemm extern off_t lseek(); 1476c2aa98e2SPeter Wemm 1477c2aa98e2SPeter Wemm if (kmem < 0) 1478c2aa98e2SPeter Wemm { 1479c2aa98e2SPeter Wemm # ifdef _AUX_SOURCE 148012ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN, 14813299c2f1SGregory Neil Shapiro sizeof Nl[X_AVENRUN].n_name); 1482c2aa98e2SPeter Wemm Nl[1].n_name[0] = '\0'; 14833299c2f1SGregory Neil Shapiro # endif /* _AUX_SOURCE */ 1484c2aa98e2SPeter Wemm 1485c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 1486c2aa98e2SPeter Wemm if (knlist(Nl, 1, sizeof Nl[0]) < 0) 14873299c2f1SGregory Neil Shapiro # else /* defined(_AIX3) || defined(_AIX4) */ 1488c2aa98e2SPeter Wemm if (nlist(_PATH_UNIX, Nl) < 0) 14893299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 1490c2aa98e2SPeter Wemm { 1491c2aa98e2SPeter Wemm if (tTd(3, 1)) 149212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: nlist(%s): %s\n", _PATH_UNIX, 149312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 14943299c2f1SGregory Neil Shapiro return -1; 1495c2aa98e2SPeter Wemm } 1496c2aa98e2SPeter Wemm if (Nl[X_AVENRUN].n_value == 0) 1497c2aa98e2SPeter Wemm { 1498c2aa98e2SPeter Wemm if (tTd(3, 1)) 149912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: nlist(%s, %s) ==> 0\n", 1500c2aa98e2SPeter Wemm _PATH_UNIX, LA_AVENRUN); 15013299c2f1SGregory Neil Shapiro return -1; 1502c2aa98e2SPeter Wemm } 1503c2aa98e2SPeter Wemm # ifdef NAMELISTMASK 1504c2aa98e2SPeter Wemm Nl[X_AVENRUN].n_value &= NAMELISTMASK; 15053299c2f1SGregory Neil Shapiro # endif /* NAMELISTMASK */ 1506c2aa98e2SPeter Wemm 1507c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, 0, 0); 1508c2aa98e2SPeter Wemm if (kmem < 0) 1509c2aa98e2SPeter Wemm { 1510c2aa98e2SPeter Wemm if (tTd(3, 1)) 151112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(/dev/kmem): %s\n", 151212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15133299c2f1SGregory Neil Shapiro return -1; 1514c2aa98e2SPeter Wemm } 151512ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 151612ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 151712ed1c7cSGregory Neil Shapiro { 151812ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 151912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 152012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 152112ed1c7cSGregory Neil Shapiro (void) close(kmem); 152212ed1c7cSGregory Neil Shapiro kmem = -1; 152312ed1c7cSGregory Neil Shapiro return -1; 152412ed1c7cSGregory Neil Shapiro } 1525c2aa98e2SPeter Wemm } 1526c2aa98e2SPeter Wemm if (tTd(3, 20)) 152712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: symbol address = %#lx\n", 152812ed1c7cSGregory Neil Shapiro (unsigned long) Nl[X_AVENRUN].n_value); 1529c2aa98e2SPeter Wemm if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 || 1530c2aa98e2SPeter Wemm read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) 1531c2aa98e2SPeter Wemm { 1532c2aa98e2SPeter Wemm /* thank you Ian */ 1533c2aa98e2SPeter Wemm if (tTd(3, 1)) 153412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: lseek or read: %s\n", 153512ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15363299c2f1SGregory Neil Shapiro return -1; 1537c2aa98e2SPeter Wemm } 1538c2aa98e2SPeter Wemm # if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) 1539c2aa98e2SPeter Wemm if (tTd(3, 5)) 1540c2aa98e2SPeter Wemm { 1541c2aa98e2SPeter Wemm # if LA_TYPE == LA_SHORT 154212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d", avenrun[0]); 1543c2aa98e2SPeter Wemm if (tTd(3, 15)) 154412ed1c7cSGregory Neil Shapiro sm_dprintf(", %d, %d", avenrun[1], avenrun[2]); 15453299c2f1SGregory Neil Shapiro # else /* LA_TYPE == LA_SHORT */ 154612ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %ld", avenrun[0]); 1547c2aa98e2SPeter Wemm if (tTd(3, 15)) 154812ed1c7cSGregory Neil Shapiro sm_dprintf(", %ld, %ld", avenrun[1], avenrun[2]); 15493299c2f1SGregory Neil Shapiro # endif /* LA_TYPE == LA_SHORT */ 155012ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1551c2aa98e2SPeter Wemm } 1552c2aa98e2SPeter Wemm if (tTd(3, 1)) 155312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 15543299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1555c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 15563299c2f1SGregory Neil Shapiro # else /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) */ 1557c2aa98e2SPeter Wemm if (tTd(3, 5)) 1558c2aa98e2SPeter Wemm { 155912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %g", avenrun[0]); 1560c2aa98e2SPeter Wemm if (tTd(3, 15)) 156112ed1c7cSGregory Neil Shapiro sm_dprintf(", %g, %g", avenrun[1], avenrun[2]); 156212ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1563c2aa98e2SPeter Wemm } 1564c2aa98e2SPeter Wemm if (tTd(3, 1)) 156512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 1566c2aa98e2SPeter Wemm return ((int) (avenrun[0] + 0.5)); 15673299c2f1SGregory Neil Shapiro # endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) */ 1568c2aa98e2SPeter Wemm } 1569c2aa98e2SPeter Wemm 15703299c2f1SGregory Neil Shapiro #endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) */ 1571c2aa98e2SPeter Wemm 1572c2aa98e2SPeter Wemm #if LA_TYPE == LA_READKSYM 1573c2aa98e2SPeter Wemm 1574c2aa98e2SPeter Wemm # include <sys/ksym.h> 1575c2aa98e2SPeter Wemm 157612ed1c7cSGregory Neil Shapiro int 1577c2aa98e2SPeter Wemm getla() 1578c2aa98e2SPeter Wemm { 157912ed1c7cSGregory Neil Shapiro int j; 1580c2aa98e2SPeter Wemm static int kmem = -1; 1581c2aa98e2SPeter Wemm long avenrun[3]; 1582c2aa98e2SPeter Wemm extern int errno; 1583c2aa98e2SPeter Wemm struct mioc_rksym mirk; 1584c2aa98e2SPeter Wemm 1585c2aa98e2SPeter Wemm if (kmem < 0) 1586c2aa98e2SPeter Wemm { 1587c2aa98e2SPeter Wemm kmem = open("/dev/kmem", 0, 0); 1588c2aa98e2SPeter Wemm if (kmem < 0) 1589c2aa98e2SPeter Wemm { 1590c2aa98e2SPeter Wemm if (tTd(3, 1)) 159112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(/dev/kmem): %s\n", 159212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 15933299c2f1SGregory Neil Shapiro return -1; 1594c2aa98e2SPeter Wemm } 159512ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 159612ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 159712ed1c7cSGregory Neil Shapiro { 159812ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 159912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 160012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 160112ed1c7cSGregory Neil Shapiro (void) close(kmem); 160212ed1c7cSGregory Neil Shapiro kmem = -1; 160312ed1c7cSGregory Neil Shapiro return -1; 160412ed1c7cSGregory Neil Shapiro } 1605c2aa98e2SPeter Wemm } 1606c2aa98e2SPeter Wemm mirk.mirk_symname = LA_AVENRUN; 1607c2aa98e2SPeter Wemm mirk.mirk_buf = avenrun; 1608c2aa98e2SPeter Wemm mirk.mirk_buflen = sizeof(avenrun); 1609c2aa98e2SPeter Wemm if (ioctl(kmem, MIOC_READKSYM, &mirk) < 0) 1610c2aa98e2SPeter Wemm { 1611c2aa98e2SPeter Wemm if (tTd(3, 1)) 161212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: ioctl(MIOC_READKSYM) failed: %s\n", 161312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1614c2aa98e2SPeter Wemm return -1; 1615c2aa98e2SPeter Wemm } 1616c2aa98e2SPeter Wemm if (tTd(3, 5)) 1617c2aa98e2SPeter Wemm { 161812ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d", avenrun[0]); 1619c2aa98e2SPeter Wemm if (tTd(3, 15)) 162012ed1c7cSGregory Neil Shapiro sm_dprintf(", %d, %d", avenrun[1], avenrun[2]); 162112ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1622c2aa98e2SPeter Wemm } 1623c2aa98e2SPeter Wemm if (tTd(3, 1)) 162412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 16253299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1626c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1627c2aa98e2SPeter Wemm } 1628c2aa98e2SPeter Wemm 1629c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_READKSYM */ 1630c2aa98e2SPeter Wemm 1631c2aa98e2SPeter Wemm #if LA_TYPE == LA_DGUX 1632c2aa98e2SPeter Wemm 1633c2aa98e2SPeter Wemm # include <sys/dg_sys_info.h> 1634c2aa98e2SPeter Wemm 163512ed1c7cSGregory Neil Shapiro int 1636c2aa98e2SPeter Wemm getla() 1637c2aa98e2SPeter Wemm { 1638c2aa98e2SPeter Wemm struct dg_sys_info_load_info load_info; 1639c2aa98e2SPeter Wemm 1640c2aa98e2SPeter Wemm dg_sys_info((long *)&load_info, 1641c2aa98e2SPeter Wemm DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0); 1642c2aa98e2SPeter Wemm 1643c2aa98e2SPeter Wemm if (tTd(3, 1)) 164412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (load_info.one_minute + 0.5)); 1645c2aa98e2SPeter Wemm 1646c2aa98e2SPeter Wemm return ((int) (load_info.one_minute + 0.5)); 1647c2aa98e2SPeter Wemm } 1648c2aa98e2SPeter Wemm 1649c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_DGUX */ 1650c2aa98e2SPeter Wemm 1651c2aa98e2SPeter Wemm #if LA_TYPE == LA_HPUX 1652c2aa98e2SPeter Wemm 1653c2aa98e2SPeter Wemm /* forward declarations to keep gcc from complaining */ 1654c2aa98e2SPeter Wemm struct pst_dynamic; 1655c2aa98e2SPeter Wemm struct pst_status; 1656c2aa98e2SPeter Wemm struct pst_static; 1657c2aa98e2SPeter Wemm struct pst_vminfo; 1658c2aa98e2SPeter Wemm struct pst_diskinfo; 1659c2aa98e2SPeter Wemm struct pst_processor; 1660c2aa98e2SPeter Wemm struct pst_lv; 1661c2aa98e2SPeter Wemm struct pst_swapinfo; 1662c2aa98e2SPeter Wemm 1663c2aa98e2SPeter Wemm # include <sys/param.h> 1664c2aa98e2SPeter Wemm # include <sys/pstat.h> 1665c2aa98e2SPeter Wemm 166612ed1c7cSGregory Neil Shapiro int 1667c2aa98e2SPeter Wemm getla() 1668c2aa98e2SPeter Wemm { 1669c2aa98e2SPeter Wemm struct pst_dynamic pstd; 1670c2aa98e2SPeter Wemm 1671c2aa98e2SPeter Wemm if (pstat_getdynamic(&pstd, sizeof(struct pst_dynamic), 1672c2aa98e2SPeter Wemm (size_t) 1, 0) == -1) 1673c2aa98e2SPeter Wemm return 0; 1674c2aa98e2SPeter Wemm 1675c2aa98e2SPeter Wemm if (tTd(3, 1)) 167612ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (pstd.psd_avg_1_min + 0.5)); 1677c2aa98e2SPeter Wemm 1678c2aa98e2SPeter Wemm return (int) (pstd.psd_avg_1_min + 0.5); 1679c2aa98e2SPeter Wemm } 1680c2aa98e2SPeter Wemm 1681c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_HPUX */ 1682c2aa98e2SPeter Wemm 1683c2aa98e2SPeter Wemm #if LA_TYPE == LA_SUBR 1684c2aa98e2SPeter Wemm 168512ed1c7cSGregory Neil Shapiro int 1686c2aa98e2SPeter Wemm getla() 1687c2aa98e2SPeter Wemm { 1688c2aa98e2SPeter Wemm double avenrun[3]; 1689c2aa98e2SPeter Wemm 1690c2aa98e2SPeter Wemm if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) < 0) 1691c2aa98e2SPeter Wemm { 1692c2aa98e2SPeter Wemm if (tTd(3, 1)) 169312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: getloadavg failed: %s", 169412ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 16953299c2f1SGregory Neil Shapiro return -1; 1696c2aa98e2SPeter Wemm } 1697c2aa98e2SPeter Wemm if (tTd(3, 1)) 169812ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 1699c2aa98e2SPeter Wemm return ((int) (avenrun[0] + 0.5)); 1700c2aa98e2SPeter Wemm } 1701c2aa98e2SPeter Wemm 1702c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_SUBR */ 1703c2aa98e2SPeter Wemm 1704c2aa98e2SPeter Wemm #if LA_TYPE == LA_MACH 1705c2aa98e2SPeter Wemm 1706c2aa98e2SPeter Wemm /* 1707c2aa98e2SPeter Wemm ** This has been tested on NEXTSTEP release 2.1/3.X. 1708c2aa98e2SPeter Wemm */ 1709c2aa98e2SPeter Wemm 1710c2aa98e2SPeter Wemm # if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 1711c2aa98e2SPeter Wemm # include <mach/mach.h> 17123299c2f1SGregory Neil Shapiro # else /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */ 1713c2aa98e2SPeter Wemm # include <mach.h> 17143299c2f1SGregory Neil Shapiro # endif /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */ 1715c2aa98e2SPeter Wemm 171612ed1c7cSGregory Neil Shapiro int 1717c2aa98e2SPeter Wemm getla() 1718c2aa98e2SPeter Wemm { 1719c2aa98e2SPeter Wemm processor_set_t default_set; 1720c2aa98e2SPeter Wemm kern_return_t error; 1721c2aa98e2SPeter Wemm unsigned int info_count; 1722c2aa98e2SPeter Wemm struct processor_set_basic_info info; 1723c2aa98e2SPeter Wemm host_t host; 1724c2aa98e2SPeter Wemm 1725c2aa98e2SPeter Wemm error = processor_set_default(host_self(), &default_set); 1726c2aa98e2SPeter Wemm if (error != KERN_SUCCESS) 1727c2aa98e2SPeter Wemm { 1728c2aa98e2SPeter Wemm if (tTd(3, 1)) 172912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: processor_set_default failed: %s", 173012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1731c2aa98e2SPeter Wemm return -1; 1732c2aa98e2SPeter Wemm } 1733c2aa98e2SPeter Wemm info_count = PROCESSOR_SET_BASIC_INFO_COUNT; 1734c2aa98e2SPeter Wemm if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO, 1735c2aa98e2SPeter Wemm &host, (processor_set_info_t)&info, 1736c2aa98e2SPeter Wemm &info_count) != KERN_SUCCESS) 1737c2aa98e2SPeter Wemm { 1738c2aa98e2SPeter Wemm if (tTd(3, 1)) 173912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: processor_set_info failed: %s", 174012ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1741c2aa98e2SPeter Wemm return -1; 1742c2aa98e2SPeter Wemm } 1743c2aa98e2SPeter Wemm if (tTd(3, 1)) 174412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 17453299c2f1SGregory Neil Shapiro (int) ((info.load_average + (LOAD_SCALE / 2)) / 17463299c2f1SGregory Neil Shapiro LOAD_SCALE)); 1747c2aa98e2SPeter Wemm return (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE; 1748c2aa98e2SPeter Wemm } 1749c2aa98e2SPeter Wemm 1750c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_MACH */ 1751c2aa98e2SPeter Wemm 1752c2aa98e2SPeter Wemm #if LA_TYPE == LA_PROCSTR 175312ed1c7cSGregory Neil Shapiro # if SM_CONF_BROKEN_STRTOD 175412ed1c7cSGregory Neil Shapiro ERROR: This OS has most likely a broken strtod() implemenentation. 175512ed1c7cSGregory Neil Shapiro ERROR: The function is required for getla(). 175612ed1c7cSGregory Neil Shapiro ERROR: Check the compilation options _LA_PROCSTR and 175712ed1c7cSGregory Neil Shapiro ERROR: _SM_CONF_BROKEN_STRTOD (without the leading _). 175812ed1c7cSGregory Neil Shapiro # endif /* SM_CONF_BROKEN_STRTOD */ 1759c2aa98e2SPeter Wemm 1760c2aa98e2SPeter Wemm /* 1761c2aa98e2SPeter Wemm ** Read /proc/loadavg for the load average. This is assumed to be 1762c2aa98e2SPeter Wemm ** in a format like "0.15 0.12 0.06". 1763c2aa98e2SPeter Wemm ** 1764c2aa98e2SPeter Wemm ** Initially intended for Linux. This has been in the kernel 1765c2aa98e2SPeter Wemm ** since at least 0.99.15. 1766c2aa98e2SPeter Wemm */ 1767c2aa98e2SPeter Wemm 1768c2aa98e2SPeter Wemm # ifndef _PATH_LOADAVG 1769c2aa98e2SPeter Wemm # define _PATH_LOADAVG "/proc/loadavg" 17703299c2f1SGregory Neil Shapiro # endif /* ! _PATH_LOADAVG */ 1771c2aa98e2SPeter Wemm 177212ed1c7cSGregory Neil Shapiro int 1773c2aa98e2SPeter Wemm getla() 1774c2aa98e2SPeter Wemm { 1775c2aa98e2SPeter Wemm double avenrun; 1776c2aa98e2SPeter Wemm register int result; 177712ed1c7cSGregory Neil Shapiro SM_FILE_T *fp; 1778c2aa98e2SPeter Wemm 177912ed1c7cSGregory Neil Shapiro fp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_LOADAVG, SM_IO_RDONLY, 178012ed1c7cSGregory Neil Shapiro NULL); 1781c2aa98e2SPeter Wemm if (fp == NULL) 1782c2aa98e2SPeter Wemm { 1783c2aa98e2SPeter Wemm if (tTd(3, 1)) 178412ed1c7cSGregory Neil Shapiro sm_dprintf("getla: sm_io_open(%s): %s\n", 178512ed1c7cSGregory Neil Shapiro _PATH_LOADAVG, sm_errstring(errno)); 1786c2aa98e2SPeter Wemm return -1; 1787c2aa98e2SPeter Wemm } 178812ed1c7cSGregory Neil Shapiro result = sm_io_fscanf(fp, SM_TIME_DEFAULT, "%lf", &avenrun); 178912ed1c7cSGregory Neil Shapiro (void) sm_io_close(fp, SM_TIME_DEFAULT); 1790c2aa98e2SPeter Wemm if (result != 1) 1791c2aa98e2SPeter Wemm { 1792c2aa98e2SPeter Wemm if (tTd(3, 1)) 179312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: sm_io_fscanf() = %d: %s\n", 179412ed1c7cSGregory Neil Shapiro result, sm_errstring(errno)); 1795c2aa98e2SPeter Wemm return -1; 1796c2aa98e2SPeter Wemm } 1797c2aa98e2SPeter Wemm 1798c2aa98e2SPeter Wemm if (tTd(3, 1)) 179912ed1c7cSGregory Neil Shapiro sm_dprintf("getla(): %.2f\n", avenrun); 1800c2aa98e2SPeter Wemm 1801c2aa98e2SPeter Wemm return ((int) (avenrun + 0.5)); 1802c2aa98e2SPeter Wemm } 1803c2aa98e2SPeter Wemm 1804c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_PROCSTR */ 1805c2aa98e2SPeter Wemm 1806c2aa98e2SPeter Wemm #if LA_TYPE == LA_IRIX6 18073299c2f1SGregory Neil Shapiro 1808c2aa98e2SPeter Wemm # include <sys/sysmp.h> 1809c2aa98e2SPeter Wemm 181012ed1c7cSGregory Neil Shapiro int 181112ed1c7cSGregory Neil Shapiro getla(void) 1812c2aa98e2SPeter Wemm { 181312ed1c7cSGregory Neil Shapiro int j; 1814c2aa98e2SPeter Wemm static int kmem = -1; 1815c2aa98e2SPeter Wemm int avenrun[3]; 1816c2aa98e2SPeter Wemm 1817c2aa98e2SPeter Wemm if (kmem < 0) 1818c2aa98e2SPeter Wemm { 1819c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, 0, 0); 1820c2aa98e2SPeter Wemm if (kmem < 0) 1821c2aa98e2SPeter Wemm { 1822c2aa98e2SPeter Wemm if (tTd(3, 1)) 182312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: open(%s): %s\n", _PATH_KMEM, 182412ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1825c2aa98e2SPeter Wemm return -1; 1826c2aa98e2SPeter Wemm } 182712ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 182812ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 182912ed1c7cSGregory Neil Shapiro { 183012ed1c7cSGregory Neil Shapiro if (tTd(3, 1)) 183112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n", 183212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 183312ed1c7cSGregory Neil Shapiro (void) close(kmem); 183412ed1c7cSGregory Neil Shapiro kmem = -1; 183512ed1c7cSGregory Neil Shapiro return -1; 183612ed1c7cSGregory Neil Shapiro } 1837c2aa98e2SPeter Wemm } 1838c2aa98e2SPeter Wemm 1839c2aa98e2SPeter Wemm if (lseek(kmem, (sysmp(MP_KERNADDR, MPKA_AVENRUN) & 0x7fffffff), SEEK_SET) == -1 || 1840c2aa98e2SPeter Wemm read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) 1841c2aa98e2SPeter Wemm { 1842c2aa98e2SPeter Wemm if (tTd(3, 1)) 184312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: lseek or read: %s\n", 184412ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1845c2aa98e2SPeter Wemm return -1; 1846c2aa98e2SPeter Wemm } 1847c2aa98e2SPeter Wemm if (tTd(3, 5)) 1848c2aa98e2SPeter Wemm { 184912ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %ld", (long int) avenrun[0]); 1850c2aa98e2SPeter Wemm if (tTd(3, 15)) 185112ed1c7cSGregory Neil Shapiro sm_dprintf(", %ld, %ld", 1852c2aa98e2SPeter Wemm (long int) avenrun[1], (long int) avenrun[2]); 185312ed1c7cSGregory Neil Shapiro sm_dprintf("\n"); 1854c2aa98e2SPeter Wemm } 1855c2aa98e2SPeter Wemm 1856c2aa98e2SPeter Wemm if (tTd(3, 1)) 185712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", 18583299c2f1SGregory Neil Shapiro (int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1859c2aa98e2SPeter Wemm return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); 1860c2aa98e2SPeter Wemm 1861c2aa98e2SPeter Wemm } 18623299c2f1SGregory Neil Shapiro #endif /* LA_TYPE == LA_IRIX6 */ 1863c2aa98e2SPeter Wemm 1864c2aa98e2SPeter Wemm #if LA_TYPE == LA_KSTAT 1865c2aa98e2SPeter Wemm 1866c2aa98e2SPeter Wemm # include <kstat.h> 1867c2aa98e2SPeter Wemm 186812ed1c7cSGregory Neil Shapiro int 1869c2aa98e2SPeter Wemm getla() 1870c2aa98e2SPeter Wemm { 1871c2aa98e2SPeter Wemm static kstat_ctl_t *kc = NULL; 1872c2aa98e2SPeter Wemm static kstat_t *ksp = NULL; 1873c2aa98e2SPeter Wemm kstat_named_t *ksn; 1874c2aa98e2SPeter Wemm int la; 1875c2aa98e2SPeter Wemm 1876c2aa98e2SPeter Wemm if (kc == NULL) /* if not initialized before */ 1877c2aa98e2SPeter Wemm kc = kstat_open(); 1878c2aa98e2SPeter Wemm if (kc == NULL) 1879c2aa98e2SPeter Wemm { 1880c2aa98e2SPeter Wemm if (tTd(3, 1)) 188112ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_open(): %s\n", 188212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1883c2aa98e2SPeter Wemm return -1; 1884c2aa98e2SPeter Wemm } 1885c2aa98e2SPeter Wemm if (ksp == NULL) 1886c2aa98e2SPeter Wemm ksp = kstat_lookup(kc, "unix", 0, "system_misc"); 1887c2aa98e2SPeter Wemm if (ksp == NULL) 1888c2aa98e2SPeter Wemm { 1889c2aa98e2SPeter Wemm if (tTd(3, 1)) 189012ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_lookup(): %s\n", 189112ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1892c2aa98e2SPeter Wemm return -1; 1893c2aa98e2SPeter Wemm } 1894c2aa98e2SPeter Wemm if (kstat_read(kc, ksp, NULL) < 0) 1895c2aa98e2SPeter Wemm { 1896c2aa98e2SPeter Wemm if (tTd(3, 1)) 189712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: kstat_read(): %s\n", 189812ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 1899c2aa98e2SPeter Wemm return -1; 1900c2aa98e2SPeter Wemm } 1901c2aa98e2SPeter Wemm ksn = (kstat_named_t *) kstat_data_lookup(ksp, "avenrun_1min"); 1902c2aa98e2SPeter Wemm la = ((double) ksn->value.ul + FSCALE/2) / FSCALE; 1903c2aa98e2SPeter Wemm /* kstat_close(kc); /o do not close for fast access */ 1904c2aa98e2SPeter Wemm return la; 1905c2aa98e2SPeter Wemm } 1906c2aa98e2SPeter Wemm 1907c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_KSTAT */ 1908c2aa98e2SPeter Wemm 1909c2aa98e2SPeter Wemm #if LA_TYPE == LA_DEVSHORT 1910c2aa98e2SPeter Wemm 1911c2aa98e2SPeter Wemm /* 1912c2aa98e2SPeter Wemm ** Read /dev/table/avenrun for the load average. This should contain 1913c2aa98e2SPeter Wemm ** three shorts for the 1, 5, and 15 minute loads. We only read the 1914c2aa98e2SPeter Wemm ** first, since that's all we care about. 1915c2aa98e2SPeter Wemm ** 1916c2aa98e2SPeter Wemm ** Intended for SCO OpenServer 5. 1917c2aa98e2SPeter Wemm */ 1918c2aa98e2SPeter Wemm 1919c2aa98e2SPeter Wemm # ifndef _PATH_AVENRUN 1920c2aa98e2SPeter Wemm # define _PATH_AVENRUN "/dev/table/avenrun" 19213299c2f1SGregory Neil Shapiro # endif /* ! _PATH_AVENRUN */ 1922c2aa98e2SPeter Wemm 192312ed1c7cSGregory Neil Shapiro int 1924c2aa98e2SPeter Wemm getla() 1925c2aa98e2SPeter Wemm { 1926c2aa98e2SPeter Wemm static int afd = -1; 1927c2aa98e2SPeter Wemm short avenrun; 1928c2aa98e2SPeter Wemm int loadav; 1929c2aa98e2SPeter Wemm int r; 1930c2aa98e2SPeter Wemm 1931c2aa98e2SPeter Wemm errno = EBADF; 1932c2aa98e2SPeter Wemm 1933c2aa98e2SPeter Wemm if (afd == -1 || lseek(afd, 0L, SEEK_SET) == -1) 1934c2aa98e2SPeter Wemm { 1935c2aa98e2SPeter Wemm if (errno != EBADF) 1936c2aa98e2SPeter Wemm return -1; 1937c2aa98e2SPeter Wemm afd = open(_PATH_AVENRUN, O_RDONLY|O_SYNC); 1938c2aa98e2SPeter Wemm if (afd < 0) 1939c2aa98e2SPeter Wemm { 1940c2aa98e2SPeter Wemm sm_syslog(LOG_ERR, NOQID, 194112ed1c7cSGregory Neil Shapiro "can't open %s: %s", 194212ed1c7cSGregory Neil Shapiro _PATH_AVENRUN, sm_errstring(errno)); 1943c2aa98e2SPeter Wemm return -1; 1944c2aa98e2SPeter Wemm } 1945c2aa98e2SPeter Wemm } 1946c2aa98e2SPeter Wemm 1947c2aa98e2SPeter Wemm r = read(afd, &avenrun, sizeof avenrun); 1948c2aa98e2SPeter Wemm 1949c2aa98e2SPeter Wemm if (tTd(3, 5)) 195012ed1c7cSGregory Neil Shapiro sm_dprintf("getla: avenrun = %d\n", avenrun); 1951c2aa98e2SPeter Wemm loadav = (int) (avenrun + FSCALE/2) >> FSHIFT; 1952c2aa98e2SPeter Wemm if (tTd(3, 1)) 195312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", loadav); 1954c2aa98e2SPeter Wemm return loadav; 1955c2aa98e2SPeter Wemm } 1956c2aa98e2SPeter Wemm 1957c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_DEVSHORT */ 1958c2aa98e2SPeter Wemm 1959c2aa98e2SPeter Wemm #if LA_TYPE == LA_ALPHAOSF 1960c2aa98e2SPeter Wemm struct rtentry; 1961c2aa98e2SPeter Wemm struct mbuf; 1962c2aa98e2SPeter Wemm # include <sys/table.h> 1963c2aa98e2SPeter Wemm 196412ed1c7cSGregory Neil Shapiro int 196512ed1c7cSGregory Neil Shapiro getla() 1966c2aa98e2SPeter Wemm { 1967c2aa98e2SPeter Wemm int ave = 0; 1968c2aa98e2SPeter Wemm struct tbl_loadavg tab; 1969c2aa98e2SPeter Wemm 1970c2aa98e2SPeter Wemm if (table(TBL_LOADAVG, 0, &tab, 1, sizeof(tab)) == -1) 1971c2aa98e2SPeter Wemm { 1972c2aa98e2SPeter Wemm if (tTd(3, 1)) 197312ed1c7cSGregory Neil Shapiro sm_dprintf("getla: table %s\n", sm_errstring(errno)); 19743299c2f1SGregory Neil Shapiro return -1; 1975c2aa98e2SPeter Wemm } 1976c2aa98e2SPeter Wemm 1977c2aa98e2SPeter Wemm if (tTd(3, 1)) 197812ed1c7cSGregory Neil Shapiro sm_dprintf("getla: scale = %d\n", tab.tl_lscale); 1979c2aa98e2SPeter Wemm 1980c2aa98e2SPeter Wemm if (tab.tl_lscale) 19813299c2f1SGregory Neil Shapiro ave = ((tab.tl_avenrun.l[2] + (tab.tl_lscale/2)) / 19823299c2f1SGregory Neil Shapiro tab.tl_lscale); 1983c2aa98e2SPeter Wemm else 19843299c2f1SGregory Neil Shapiro ave = (int) (tab.tl_avenrun.d[2] + 0.5); 1985c2aa98e2SPeter Wemm 1986c2aa98e2SPeter Wemm if (tTd(3, 1)) 198712ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", ave); 1988c2aa98e2SPeter Wemm 1989c2aa98e2SPeter Wemm return ave; 1990c2aa98e2SPeter Wemm } 1991c2aa98e2SPeter Wemm 19923299c2f1SGregory Neil Shapiro #endif /* LA_TYPE == LA_ALPHAOSF */ 1993c2aa98e2SPeter Wemm 1994c46d91b7SGregory Neil Shapiro #if LA_TYPE == LA_PSET 1995c46d91b7SGregory Neil Shapiro 199612ed1c7cSGregory Neil Shapiro int 1997c46d91b7SGregory Neil Shapiro getla() 1998c46d91b7SGregory Neil Shapiro { 1999c46d91b7SGregory Neil Shapiro double avenrun[3]; 2000c46d91b7SGregory Neil Shapiro 2001c46d91b7SGregory Neil Shapiro if (pset_getloadavg(PS_MYID, avenrun, 2002c46d91b7SGregory Neil Shapiro sizeof(avenrun) / sizeof(avenrun[0])) < 0) 2003c46d91b7SGregory Neil Shapiro { 2004c46d91b7SGregory Neil Shapiro if (tTd(3, 1)) 200512ed1c7cSGregory Neil Shapiro sm_dprintf("getla: pset_getloadavg failed: %s", 200612ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 2007c46d91b7SGregory Neil Shapiro return -1; 2008c46d91b7SGregory Neil Shapiro } 2009c46d91b7SGregory Neil Shapiro if (tTd(3, 1)) 201012ed1c7cSGregory Neil Shapiro sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5)); 2011c46d91b7SGregory Neil Shapiro return ((int) (avenrun[0] + 0.5)); 2012c46d91b7SGregory Neil Shapiro } 2013c46d91b7SGregory Neil Shapiro 2014c46d91b7SGregory Neil Shapiro #endif /* LA_TYPE == LA_PSET */ 2015c46d91b7SGregory Neil Shapiro 2016c2aa98e2SPeter Wemm #if LA_TYPE == LA_ZERO 2017c2aa98e2SPeter Wemm 201812ed1c7cSGregory Neil Shapiro int 2019c2aa98e2SPeter Wemm getla() 2020c2aa98e2SPeter Wemm { 2021c2aa98e2SPeter Wemm if (tTd(3, 1)) 202212ed1c7cSGregory Neil Shapiro sm_dprintf("getla: ZERO\n"); 20233299c2f1SGregory Neil Shapiro return 0; 2024c2aa98e2SPeter Wemm } 2025c2aa98e2SPeter Wemm 2026c2aa98e2SPeter Wemm #endif /* LA_TYPE == LA_ZERO */ 2027c2aa98e2SPeter Wemm 2028c2aa98e2SPeter Wemm /* 2029c2aa98e2SPeter Wemm * Copyright 1989 Massachusetts Institute of Technology 2030c2aa98e2SPeter Wemm * 2031c2aa98e2SPeter Wemm * Permission to use, copy, modify, distribute, and sell this software and its 2032c2aa98e2SPeter Wemm * documentation for any purpose is hereby granted without fee, provided that 2033c2aa98e2SPeter Wemm * the above copyright notice appear in all copies and that both that 2034c2aa98e2SPeter Wemm * copyright notice and this permission notice appear in supporting 2035c2aa98e2SPeter Wemm * documentation, and that the name of M.I.T. not be used in advertising or 2036c2aa98e2SPeter Wemm * publicity pertaining to distribution of the software without specific, 2037c2aa98e2SPeter Wemm * written prior permission. M.I.T. makes no representations about the 2038c2aa98e2SPeter Wemm * suitability of this software for any purpose. It is provided "as is" 2039c2aa98e2SPeter Wemm * without express or implied warranty. 2040c2aa98e2SPeter Wemm * 2041c2aa98e2SPeter Wemm * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL 2042c2aa98e2SPeter Wemm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. 2043c2aa98e2SPeter Wemm * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 2044c2aa98e2SPeter Wemm * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 2045c2aa98e2SPeter Wemm * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 2046c2aa98e2SPeter Wemm * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 2047c2aa98e2SPeter Wemm * 2048c2aa98e2SPeter Wemm * Authors: Many and varied... 2049c2aa98e2SPeter Wemm */ 2050c2aa98e2SPeter Wemm 2051c2aa98e2SPeter Wemm /* Non Apollo stuff removed by Don Lewis 11/15/93 */ 2052c2aa98e2SPeter Wemm #ifndef lint 205312ed1c7cSGregory Neil Shapiro SM_UNUSED(static char rcsid[]) = "@(#)$OrigId: getloadavg.c,v 1.16 1991/06/21 12:51:15 paul Exp $"; 2054c2aa98e2SPeter Wemm #endif /* ! lint */ 2055c2aa98e2SPeter Wemm 2056c2aa98e2SPeter Wemm #ifdef apollo 2057c2aa98e2SPeter Wemm # undef volatile 2058c2aa98e2SPeter Wemm # include <apollo/base.h> 2059c2aa98e2SPeter Wemm 2060c2aa98e2SPeter Wemm /* ARGSUSED */ 2061c2aa98e2SPeter Wemm int getloadavg( call_data ) 2062c2aa98e2SPeter Wemm caddr_t call_data; /* pointer to (double) return value */ 2063c2aa98e2SPeter Wemm { 2064c2aa98e2SPeter Wemm double *avenrun = (double *) call_data; 2065c2aa98e2SPeter Wemm int i; 2066c2aa98e2SPeter Wemm status_$t st; 2067c2aa98e2SPeter Wemm long loadav[3]; 206812ed1c7cSGregory Neil Shapiro 2069c2aa98e2SPeter Wemm proc1_$get_loadav(loadav, &st); 2070c2aa98e2SPeter Wemm *avenrun = loadav[0] / (double) (1 << 16); 20713299c2f1SGregory Neil Shapiro return 0; 2072c2aa98e2SPeter Wemm } 2073c2aa98e2SPeter Wemm #endif /* apollo */ 207412ed1c7cSGregory Neil Shapiro /* 207512ed1c7cSGregory Neil Shapiro ** SM_GETLA -- get the current load average 20763299c2f1SGregory Neil Shapiro ** 20773299c2f1SGregory Neil Shapiro ** Parameters: 207812ed1c7cSGregory Neil Shapiro ** none 20793299c2f1SGregory Neil Shapiro ** 20803299c2f1SGregory Neil Shapiro ** Returns: 208112ed1c7cSGregory Neil Shapiro ** none 20823299c2f1SGregory Neil Shapiro ** 20833299c2f1SGregory Neil Shapiro ** Side Effects: 208412ed1c7cSGregory Neil Shapiro ** Set CurrentLA to the current load average. 208512ed1c7cSGregory Neil Shapiro ** Set {load_avg} in GlobalMacros to the current load average. 20863299c2f1SGregory Neil Shapiro */ 20873299c2f1SGregory Neil Shapiro 208812ed1c7cSGregory Neil Shapiro void 208912ed1c7cSGregory Neil Shapiro sm_getla() 20903299c2f1SGregory Neil Shapiro { 20913299c2f1SGregory Neil Shapiro char labuf[8]; 20923299c2f1SGregory Neil Shapiro 209312ed1c7cSGregory Neil Shapiro CurrentLA = getla(); 209412ed1c7cSGregory Neil Shapiro (void) sm_snprintf(labuf, sizeof labuf, "%d", CurrentLA); 209512ed1c7cSGregory Neil Shapiro macdefine(&GlobalMacros, A_TEMP, macid("{load_avg}"), labuf); 20963299c2f1SGregory Neil Shapiro } 209712ed1c7cSGregory Neil Shapiro /* 2098c2aa98e2SPeter Wemm ** SHOULDQUEUE -- should this message be queued or sent? 2099c2aa98e2SPeter Wemm ** 2100c2aa98e2SPeter Wemm ** Compares the message cost to the load average to decide. 2101c2aa98e2SPeter Wemm ** 210212ed1c7cSGregory Neil Shapiro ** Note: Do NOT change this API! It is documented in op.me 210312ed1c7cSGregory Neil Shapiro ** and theoretically the user can change this function... 210412ed1c7cSGregory Neil Shapiro ** 2105c2aa98e2SPeter Wemm ** Parameters: 2106c2aa98e2SPeter Wemm ** pri -- the priority of the message in question. 210712ed1c7cSGregory Neil Shapiro ** ct -- the message creation time (unused, but see above). 2108c2aa98e2SPeter Wemm ** 2109c2aa98e2SPeter Wemm ** Returns: 211012ed1c7cSGregory Neil Shapiro ** true -- if this message should be queued up for the 2111c2aa98e2SPeter Wemm ** time being. 211212ed1c7cSGregory Neil Shapiro ** false -- if the load is low enough to send this message. 2113c2aa98e2SPeter Wemm ** 2114c2aa98e2SPeter Wemm ** Side Effects: 2115c2aa98e2SPeter Wemm ** none. 2116c2aa98e2SPeter Wemm */ 2117c2aa98e2SPeter Wemm 21183299c2f1SGregory Neil Shapiro /* ARGSUSED1 */ 2119c2aa98e2SPeter Wemm bool 21203299c2f1SGregory Neil Shapiro shouldqueue(pri, ct) 2121c2aa98e2SPeter Wemm long pri; 21223299c2f1SGregory Neil Shapiro time_t ct; 2123c2aa98e2SPeter Wemm { 2124c2aa98e2SPeter Wemm bool rval; 2125c2aa98e2SPeter Wemm 2126c2aa98e2SPeter Wemm if (tTd(3, 30)) 212712ed1c7cSGregory Neil Shapiro sm_dprintf("shouldqueue: CurrentLA=%d, pri=%ld: ", 21283299c2f1SGregory Neil Shapiro CurrentLA, pri); 21293299c2f1SGregory Neil Shapiro if (CurrentLA < QueueLA) 2130c2aa98e2SPeter Wemm { 2131c2aa98e2SPeter Wemm if (tTd(3, 30)) 213212ed1c7cSGregory Neil Shapiro sm_dprintf("false (CurrentLA < QueueLA)\n"); 213312ed1c7cSGregory Neil Shapiro return false; 2134c2aa98e2SPeter Wemm } 2135c2aa98e2SPeter Wemm # if 0 /* this code is reported to cause oscillation around RefuseLA */ 2136c2aa98e2SPeter Wemm if (CurrentLA >= RefuseLA && QueueLA < RefuseLA) 2137c2aa98e2SPeter Wemm { 2138c2aa98e2SPeter Wemm if (tTd(3, 30)) 213912ed1c7cSGregory Neil Shapiro sm_dprintf("TRUE (CurrentLA >= RefuseLA)\n"); 214012ed1c7cSGregory Neil Shapiro return true; 2141c2aa98e2SPeter Wemm } 21423299c2f1SGregory Neil Shapiro # endif /* 0 */ 21433299c2f1SGregory Neil Shapiro rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1)); 2144c2aa98e2SPeter Wemm if (tTd(3, 30)) 214512ed1c7cSGregory Neil Shapiro sm_dprintf("%s (by calculation)\n", rval ? "true" : "false"); 2146c2aa98e2SPeter Wemm return rval; 2147c2aa98e2SPeter Wemm } 214812ed1c7cSGregory Neil Shapiro /* 2149c2aa98e2SPeter Wemm ** REFUSECONNECTIONS -- decide if connections should be refused 2150c2aa98e2SPeter Wemm ** 2151c2aa98e2SPeter Wemm ** Parameters: 21523299c2f1SGregory Neil Shapiro ** name -- daemon name (for error messages only) 21533299c2f1SGregory Neil Shapiro ** e -- the current envelope. 21543299c2f1SGregory Neil Shapiro ** d -- number of daemon 215512ed1c7cSGregory Neil Shapiro ** active -- was this daemon actually active? 2156c2aa98e2SPeter Wemm ** 2157c2aa98e2SPeter Wemm ** Returns: 215812ed1c7cSGregory Neil Shapiro ** true if incoming SMTP connections should be refused 2159c2aa98e2SPeter Wemm ** (for now). 216012ed1c7cSGregory Neil Shapiro ** false if we should accept new work. 2161c2aa98e2SPeter Wemm ** 2162c2aa98e2SPeter Wemm ** Side Effects: 2163c2aa98e2SPeter Wemm ** Sets process title when it is rejecting connections. 2164c2aa98e2SPeter Wemm */ 2165c2aa98e2SPeter Wemm 2166c2aa98e2SPeter Wemm bool 216712ed1c7cSGregory Neil Shapiro refuseconnections(name, e, d, active) 21683299c2f1SGregory Neil Shapiro char *name; 21693299c2f1SGregory Neil Shapiro ENVELOPE *e; 21703299c2f1SGregory Neil Shapiro int d; 217112ed1c7cSGregory Neil Shapiro bool active; 2172c2aa98e2SPeter Wemm { 217312ed1c7cSGregory Neil Shapiro static time_t lastconn[MAXDAEMONS]; 217412ed1c7cSGregory Neil Shapiro static int conncnt[MAXDAEMONS]; 217512ed1c7cSGregory Neil Shapiro 217612ed1c7cSGregory Neil Shapiro #if XLA 2177c2aa98e2SPeter Wemm if (!xla_smtp_ok()) 217812ed1c7cSGregory Neil Shapiro return true; 21793299c2f1SGregory Neil Shapiro #endif /* XLA */ 2180c2aa98e2SPeter Wemm 218112ed1c7cSGregory Neil Shapiro if (ConnRateThrottle > 0) 218212ed1c7cSGregory Neil Shapiro { 218312ed1c7cSGregory Neil Shapiro time_t now; 218412ed1c7cSGregory Neil Shapiro 218512ed1c7cSGregory Neil Shapiro now = curtime(); 218612ed1c7cSGregory Neil Shapiro if (active) 218712ed1c7cSGregory Neil Shapiro { 218812ed1c7cSGregory Neil Shapiro if (now != lastconn[d]) 218912ed1c7cSGregory Neil Shapiro { 219012ed1c7cSGregory Neil Shapiro lastconn[d] = now; 219112ed1c7cSGregory Neil Shapiro conncnt[d] = 1; 219212ed1c7cSGregory Neil Shapiro } 219312ed1c7cSGregory Neil Shapiro else if (conncnt[d]++ > ConnRateThrottle) 219412ed1c7cSGregory Neil Shapiro { 219512ed1c7cSGregory Neil Shapiro #define D_MSG_CRT "deferring connections on daemon %s: %d per second" 219612ed1c7cSGregory Neil Shapiro /* sleep to flatten out connection load */ 219712ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, D_MSG_CRT, 219812ed1c7cSGregory Neil Shapiro name, ConnRateThrottle); 219912ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 220012ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, D_MSG_CRT, 220112ed1c7cSGregory Neil Shapiro name, ConnRateThrottle); 220212ed1c7cSGregory Neil Shapiro (void) sleep(1); 220312ed1c7cSGregory Neil Shapiro } 220412ed1c7cSGregory Neil Shapiro } 220512ed1c7cSGregory Neil Shapiro else if (now != lastconn[d]) 220612ed1c7cSGregory Neil Shapiro conncnt[d] = 0; 220712ed1c7cSGregory Neil Shapiro } 220812ed1c7cSGregory Neil Shapiro 220912ed1c7cSGregory Neil Shapiro sm_getla(); 22103299c2f1SGregory Neil Shapiro if (RefuseLA > 0 && CurrentLA >= RefuseLA) 2211c2aa98e2SPeter Wemm { 221212ed1c7cSGregory Neil Shapiro # define R_MSG_LA "rejecting connections on daemon %s: load average: %d" 221312ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, R_MSG_LA, name, CurrentLA); 221412ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 221512ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, R_MSG_LA, name, CurrentLA); 221612ed1c7cSGregory Neil Shapiro return true; 221712ed1c7cSGregory Neil Shapiro } 221812ed1c7cSGregory Neil Shapiro 221912ed1c7cSGregory Neil Shapiro if (DelayLA > 0 && CurrentLA >= DelayLA) 222012ed1c7cSGregory Neil Shapiro { 222112ed1c7cSGregory Neil Shapiro time_t now; 222212ed1c7cSGregory Neil Shapiro static time_t log_delay = (time_t) 0; 222312ed1c7cSGregory Neil Shapiro 222412ed1c7cSGregory Neil Shapiro # define MIN_DELAY_LOG 90 /* wait before logging this again */ 222512ed1c7cSGregory Neil Shapiro # define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d" 222612ed1c7cSGregory Neil Shapiro /* sleep to flatten out connection load */ 222712ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, D_MSG_LA, name, DelayLA); 222812ed1c7cSGregory Neil Shapiro if (LogLevel > 8 && (now = curtime()) > log_delay) 222912ed1c7cSGregory Neil Shapiro { 223012ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, D_MSG_LA, 223112ed1c7cSGregory Neil Shapiro name, CurrentLA, DelayLA); 223212ed1c7cSGregory Neil Shapiro log_delay = now + MIN_DELAY_LOG; 223312ed1c7cSGregory Neil Shapiro } 223412ed1c7cSGregory Neil Shapiro (void) sleep(1); 2235c2aa98e2SPeter Wemm } 2236c2aa98e2SPeter Wemm 2237c2aa98e2SPeter Wemm if (MaxChildren > 0 && CurChildren >= MaxChildren) 2238c2aa98e2SPeter Wemm { 2239c2aa98e2SPeter Wemm proc_list_probe(); 2240c2aa98e2SPeter Wemm if (CurChildren >= MaxChildren) 2241c2aa98e2SPeter Wemm { 224212ed1c7cSGregory Neil Shapiro #define R_MSG_CHILD "rejecting connections on daemon %s: %d children, max %d" 224312ed1c7cSGregory Neil Shapiro sm_setproctitle(true, e, R_MSG_CHILD, 22443299c2f1SGregory Neil Shapiro name, CurChildren, MaxChildren); 224512ed1c7cSGregory Neil Shapiro if (LogLevel > 8) 224612ed1c7cSGregory Neil Shapiro sm_syslog(LOG_INFO, NOQID, R_MSG_CHILD, 22473299c2f1SGregory Neil Shapiro name, CurChildren, MaxChildren); 224812ed1c7cSGregory Neil Shapiro return true; 2249c2aa98e2SPeter Wemm } 2250c2aa98e2SPeter Wemm } 225112ed1c7cSGregory Neil Shapiro return false; 2252c2aa98e2SPeter Wemm } 225312ed1c7cSGregory Neil Shapiro /* 2254c2aa98e2SPeter Wemm ** SETPROCTITLE -- set process title for ps 2255c2aa98e2SPeter Wemm ** 2256c2aa98e2SPeter Wemm ** Parameters: 2257c2aa98e2SPeter Wemm ** fmt -- a printf style format string. 2258c2aa98e2SPeter Wemm ** a, b, c -- possible parameters to fmt. 2259c2aa98e2SPeter Wemm ** 2260c2aa98e2SPeter Wemm ** Returns: 2261c2aa98e2SPeter Wemm ** none. 2262c2aa98e2SPeter Wemm ** 2263c2aa98e2SPeter Wemm ** Side Effects: 2264c2aa98e2SPeter Wemm ** Clobbers argv of our main procedure so ps(1) will 2265c2aa98e2SPeter Wemm ** display the title. 2266c2aa98e2SPeter Wemm */ 2267c2aa98e2SPeter Wemm 2268c2aa98e2SPeter Wemm #define SPT_NONE 0 /* don't use it at all */ 2269c2aa98e2SPeter Wemm #define SPT_REUSEARGV 1 /* cover argv with title information */ 2270c2aa98e2SPeter Wemm #define SPT_BUILTIN 2 /* use libc builtin */ 2271c2aa98e2SPeter Wemm #define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */ 2272c2aa98e2SPeter Wemm #define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */ 2273c2aa98e2SPeter Wemm #define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */ 2274c2aa98e2SPeter Wemm #define SPT_SCO 6 /* write kernel u. area */ 2275c2aa98e2SPeter Wemm #define SPT_CHANGEARGV 7 /* write our own strings into argv[] */ 2276c2aa98e2SPeter Wemm 2277c2aa98e2SPeter Wemm #ifndef SPT_TYPE 2278c2aa98e2SPeter Wemm # define SPT_TYPE SPT_REUSEARGV 22793299c2f1SGregory Neil Shapiro #endif /* ! SPT_TYPE */ 22803299c2f1SGregory Neil Shapiro 2281c2aa98e2SPeter Wemm 2282c2aa98e2SPeter Wemm #if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN 2283c2aa98e2SPeter Wemm 2284c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2285c2aa98e2SPeter Wemm # include <sys/pstat.h> 22863299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2287c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS 2288c2aa98e2SPeter Wemm # include <machine/vmparam.h> 2289c2aa98e2SPeter Wemm # include <sys/exec.h> 2290c2aa98e2SPeter Wemm # ifndef PS_STRINGS /* hmmmm.... apparently not available after all */ 2291c2aa98e2SPeter Wemm # undef SPT_TYPE 2292c2aa98e2SPeter Wemm # define SPT_TYPE SPT_REUSEARGV 22933299c2f1SGregory Neil Shapiro # else /* ! PS_STRINGS */ 2294c2aa98e2SPeter Wemm # ifndef NKPDE /* FreeBSD 2.0 */ 2295c2aa98e2SPeter Wemm # define NKPDE 63 2296c2aa98e2SPeter Wemm typedef unsigned int *pt_entry_t; 22973299c2f1SGregory Neil Shapiro # endif /* ! NKPDE */ 22983299c2f1SGregory Neil Shapiro # endif /* ! PS_STRINGS */ 22993299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS */ 2300c2aa98e2SPeter Wemm 2301c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV 2302c2aa98e2SPeter Wemm # define SETPROC_STATIC static 23033299c2f1SGregory Neil Shapiro # else /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */ 2304c2aa98e2SPeter Wemm # define SETPROC_STATIC 23053299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */ 2306c2aa98e2SPeter Wemm 2307c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SYSMIPS 2308c2aa98e2SPeter Wemm # include <sys/sysmips.h> 2309c2aa98e2SPeter Wemm # include <sys/sysnews.h> 23103299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SYSMIPS */ 2311c2aa98e2SPeter Wemm 2312c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 2313c2aa98e2SPeter Wemm # include <sys/immu.h> 2314c2aa98e2SPeter Wemm # include <sys/dir.h> 2315c2aa98e2SPeter Wemm # include <sys/user.h> 2316c2aa98e2SPeter Wemm # include <sys/fs/s5param.h> 2317c2aa98e2SPeter Wemm # if PSARGSZ > MAXLINE 2318c2aa98e2SPeter Wemm # define SPT_BUFSIZE PSARGSZ 23193299c2f1SGregory Neil Shapiro # endif /* PSARGSZ > MAXLINE */ 23203299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2321c2aa98e2SPeter Wemm 2322c2aa98e2SPeter Wemm # ifndef SPT_PADCHAR 2323c2aa98e2SPeter Wemm # define SPT_PADCHAR ' ' 23243299c2f1SGregory Neil Shapiro # endif /* ! SPT_PADCHAR */ 2325c2aa98e2SPeter Wemm 232676b7bf71SPeter Wemm #endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */ 232776b7bf71SPeter Wemm 2328c2aa98e2SPeter Wemm #ifndef SPT_BUFSIZE 2329c2aa98e2SPeter Wemm # define SPT_BUFSIZE MAXLINE 23303299c2f1SGregory Neil Shapiro #endif /* ! SPT_BUFSIZE */ 2331c2aa98e2SPeter Wemm 233288ad41d4SGregory Neil Shapiro #if _FFR_SPT_ALIGN 233388ad41d4SGregory Neil Shapiro 233488ad41d4SGregory Neil Shapiro /* 233588ad41d4SGregory Neil Shapiro ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 233688ad41d4SGregory Neil Shapiro ** 64 bit alignment, so unless each piece of argv and envp is a multiple 233788ad41d4SGregory Neil Shapiro ** of 8 bytes (including terminating NULL), initsetproctitle() won't use 233888ad41d4SGregory Neil Shapiro ** any of the space beyond argv[0]. Be sure to set SPT_ALIGN_SIZE if 233988ad41d4SGregory Neil Shapiro ** you use this FFR. 234088ad41d4SGregory Neil Shapiro */ 234188ad41d4SGregory Neil Shapiro 234288ad41d4SGregory Neil Shapiro # ifdef SPT_ALIGN_SIZE 2343f848909fSGregory Neil Shapiro # define SPT_ALIGN(x, align) (((((x) + SPT_ALIGN_SIZE) >> (align)) << (align)) - 1) 234488ad41d4SGregory Neil Shapiro # else /* SPT_ALIGN_SIZE */ 234588ad41d4SGregory Neil Shapiro # define SPT_ALIGN(x, align) (x) 234688ad41d4SGregory Neil Shapiro # endif /* SPT_ALIGN_SIZE */ 234788ad41d4SGregory Neil Shapiro #else /* _FFR_SPT_ALIGN */ 234888ad41d4SGregory Neil Shapiro # define SPT_ALIGN(x, align) (x) 234988ad41d4SGregory Neil Shapiro #endif /* _FFR_SPT_ALIGN */ 235088ad41d4SGregory Neil Shapiro 2351c2aa98e2SPeter Wemm /* 2352c2aa98e2SPeter Wemm ** Pointers for setproctitle. 2353c2aa98e2SPeter Wemm ** This allows "ps" listings to give more useful information. 2354c2aa98e2SPeter Wemm */ 2355c2aa98e2SPeter Wemm 23563299c2f1SGregory Neil Shapiro static char **Argv = NULL; /* pointer to argument vector */ 23573299c2f1SGregory Neil Shapiro static char *LastArgv = NULL; /* end of argv */ 23583299c2f1SGregory Neil Shapiro #if SPT_TYPE != SPT_BUILTIN 23593299c2f1SGregory Neil Shapiro static void setproctitle __P((const char *, ...)); 23603299c2f1SGregory Neil Shapiro #endif /* SPT_TYPE != SPT_BUILTIN */ 2361c2aa98e2SPeter Wemm 2362c2aa98e2SPeter Wemm void 2363c2aa98e2SPeter Wemm initsetproctitle(argc, argv, envp) 2364c2aa98e2SPeter Wemm int argc; 2365c2aa98e2SPeter Wemm char **argv; 2366c2aa98e2SPeter Wemm char **envp; 2367c2aa98e2SPeter Wemm { 236812ed1c7cSGregory Neil Shapiro register int i; 236988ad41d4SGregory Neil Shapiro int align; 2370c2aa98e2SPeter Wemm extern char **environ; 2371c2aa98e2SPeter Wemm 2372c2aa98e2SPeter Wemm /* 2373c2aa98e2SPeter Wemm ** Move the environment so setproctitle can use the space at 2374c2aa98e2SPeter Wemm ** the top of memory. 2375c2aa98e2SPeter Wemm */ 2376c2aa98e2SPeter Wemm 23779d8fddc1SGregory Neil Shapiro if (envp != NULL) 23789d8fddc1SGregory Neil Shapiro { 2379c2aa98e2SPeter Wemm for (i = 0; envp[i] != NULL; i++) 238012ed1c7cSGregory Neil Shapiro continue; 2381c2aa98e2SPeter Wemm environ = (char **) xalloc(sizeof (char *) * (i + 1)); 2382c2aa98e2SPeter Wemm for (i = 0; envp[i] != NULL; i++) 2383c2aa98e2SPeter Wemm environ[i] = newstr(envp[i]); 2384c2aa98e2SPeter Wemm environ[i] = NULL; 23859d8fddc1SGregory Neil Shapiro } 2386c2aa98e2SPeter Wemm 2387c2aa98e2SPeter Wemm /* 2388c2aa98e2SPeter Wemm ** Save start and extent of argv for setproctitle. 2389c2aa98e2SPeter Wemm */ 2390c2aa98e2SPeter Wemm 2391c2aa98e2SPeter Wemm Argv = argv; 2392c2aa98e2SPeter Wemm 2393c2aa98e2SPeter Wemm /* 2394c2aa98e2SPeter Wemm ** Determine how much space we can use for setproctitle. 2395c2aa98e2SPeter Wemm ** Use all contiguous argv and envp pointers starting at argv[0] 2396c2aa98e2SPeter Wemm */ 239788ad41d4SGregory Neil Shapiro 239888ad41d4SGregory Neil Shapiro align = -1; 239988ad41d4SGregory Neil Shapiro #if _FFR_SPT_ALIGN 240088ad41d4SGregory Neil Shapiro # ifdef SPT_ALIGN_SIZE 240188ad41d4SGregory Neil Shapiro for (i = SPT_ALIGN_SIZE; i > 0; i >>= 1) 240288ad41d4SGregory Neil Shapiro align++; 240388ad41d4SGregory Neil Shapiro # endif /* SPT_ALIGN_SIZE */ 240488ad41d4SGregory Neil Shapiro #endif /* _FFR_SPT_ALIGN */ 240588ad41d4SGregory Neil Shapiro 2406c2aa98e2SPeter Wemm for (i = 0; i < argc; i++) 2407c2aa98e2SPeter Wemm { 2408c2aa98e2SPeter Wemm if (i == 0 || LastArgv + 1 == argv[i]) 240988ad41d4SGregory Neil Shapiro LastArgv = argv[i] + SPT_ALIGN(strlen(argv[i]), align); 2410c2aa98e2SPeter Wemm } 24119d8fddc1SGregory Neil Shapiro for (i = 0; LastArgv != NULL && envp != NULL && envp[i] != NULL; i++) 2412c2aa98e2SPeter Wemm { 2413c2aa98e2SPeter Wemm if (LastArgv + 1 == envp[i]) 241488ad41d4SGregory Neil Shapiro LastArgv = envp[i] + SPT_ALIGN(strlen(envp[i]), align); 2415c2aa98e2SPeter Wemm } 2416c2aa98e2SPeter Wemm } 2417c2aa98e2SPeter Wemm 2418c2aa98e2SPeter Wemm #if SPT_TYPE != SPT_BUILTIN 2419c2aa98e2SPeter Wemm 2420c2aa98e2SPeter Wemm /*VARARGS1*/ 24213299c2f1SGregory Neil Shapiro static void 2422c2aa98e2SPeter Wemm # ifdef __STDC__ 2423c2aa98e2SPeter Wemm setproctitle(const char *fmt, ...) 24243299c2f1SGregory Neil Shapiro # else /* __STDC__ */ 2425c2aa98e2SPeter Wemm setproctitle(fmt, va_alist) 2426c2aa98e2SPeter Wemm const char *fmt; 2427c2aa98e2SPeter Wemm va_dcl 24283299c2f1SGregory Neil Shapiro # endif /* __STDC__ */ 2429c2aa98e2SPeter Wemm { 2430c2aa98e2SPeter Wemm # if SPT_TYPE != SPT_NONE 2431c2aa98e2SPeter Wemm register int i; 24323299c2f1SGregory Neil Shapiro register char *p; 2433c2aa98e2SPeter Wemm SETPROC_STATIC char buf[SPT_BUFSIZE]; 243412ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 2435c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2436c2aa98e2SPeter Wemm union pstun pst; 24373299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2438c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 243912ed1c7cSGregory Neil Shapiro int j; 2440c2aa98e2SPeter Wemm off_t seek_off; 2441c2aa98e2SPeter Wemm static int kmem = -1; 2442c0c4794dSGregory Neil Shapiro static pid_t kmempid = -1; 2443c2aa98e2SPeter Wemm struct user u; 24443299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2445c2aa98e2SPeter Wemm 2446c2aa98e2SPeter Wemm p = buf; 2447c2aa98e2SPeter Wemm 2448c2aa98e2SPeter Wemm /* print sendmail: heading for grep */ 244912ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(p, "sendmail: ", SPACELEFT(buf, p)); 2450c2aa98e2SPeter Wemm p += strlen(p); 2451c2aa98e2SPeter Wemm 2452c2aa98e2SPeter Wemm /* print the argument string */ 245312ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 245412ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(p, SPACELEFT(buf, p), fmt, ap); 245512ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 2456c2aa98e2SPeter Wemm 245712ed1c7cSGregory Neil Shapiro i = (int) strlen(buf); 245812ed1c7cSGregory Neil Shapiro if (i < 0) 245912ed1c7cSGregory Neil Shapiro return; 2460c2aa98e2SPeter Wemm 2461c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSTAT 2462c2aa98e2SPeter Wemm pst.pst_command = buf; 2463c2aa98e2SPeter Wemm pstat(PSTAT_SETCMD, pst, i, 0, 0); 24643299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSTAT */ 2465c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_PSSTRINGS 2466c2aa98e2SPeter Wemm PS_STRINGS->ps_nargvstr = 1; 2467c2aa98e2SPeter Wemm PS_STRINGS->ps_argvstr = buf; 24683299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_PSSTRINGS */ 2469c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SYSMIPS 2470c2aa98e2SPeter Wemm sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf); 24713299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SYSMIPS */ 2472c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_SCO 247312ed1c7cSGregory Neil Shapiro if (kmem < 0 || kmempid != CurrentPid) 2474c2aa98e2SPeter Wemm { 2475c2aa98e2SPeter Wemm if (kmem >= 0) 2476c46d91b7SGregory Neil Shapiro (void) close(kmem); 2477c2aa98e2SPeter Wemm kmem = open(_PATH_KMEM, O_RDWR, 0); 2478c2aa98e2SPeter Wemm if (kmem < 0) 2479c2aa98e2SPeter Wemm return; 248012ed1c7cSGregory Neil Shapiro if ((j = fcntl(kmem, F_GETFD, 0)) < 0 || 248112ed1c7cSGregory Neil Shapiro fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0) 248212ed1c7cSGregory Neil Shapiro { 248312ed1c7cSGregory Neil Shapiro (void) close(kmem); 248412ed1c7cSGregory Neil Shapiro kmem = -1; 248512ed1c7cSGregory Neil Shapiro return; 248612ed1c7cSGregory Neil Shapiro } 248712ed1c7cSGregory Neil Shapiro kmempid = CurrentPid; 2488c2aa98e2SPeter Wemm } 2489c2aa98e2SPeter Wemm buf[PSARGSZ - 1] = '\0'; 2490c2aa98e2SPeter Wemm seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u; 2491c2aa98e2SPeter Wemm if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off) 2492c2aa98e2SPeter Wemm (void) write(kmem, buf, PSARGSZ); 24933299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_SCO */ 2494c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_REUSEARGV 24953299c2f1SGregory Neil Shapiro if (LastArgv == NULL) 24963299c2f1SGregory Neil Shapiro return; 24973299c2f1SGregory Neil Shapiro 2498c2aa98e2SPeter Wemm if (i > LastArgv - Argv[0] - 2) 2499c2aa98e2SPeter Wemm { 2500c2aa98e2SPeter Wemm i = LastArgv - Argv[0] - 2; 2501c2aa98e2SPeter Wemm buf[i] = '\0'; 2502c2aa98e2SPeter Wemm } 250312ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(Argv[0], buf, i + 1); 2504c2aa98e2SPeter Wemm p = &Argv[0][i]; 2505c2aa98e2SPeter Wemm while (p < LastArgv) 2506c2aa98e2SPeter Wemm *p++ = SPT_PADCHAR; 2507c2aa98e2SPeter Wemm Argv[1] = NULL; 25083299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_REUSEARGV */ 2509c2aa98e2SPeter Wemm # if SPT_TYPE == SPT_CHANGEARGV 2510c2aa98e2SPeter Wemm Argv[0] = buf; 2511c2aa98e2SPeter Wemm Argv[1] = 0; 25123299c2f1SGregory Neil Shapiro # endif /* SPT_TYPE == SPT_CHANGEARGV */ 2513c2aa98e2SPeter Wemm # endif /* SPT_TYPE != SPT_NONE */ 2514c2aa98e2SPeter Wemm } 2515c2aa98e2SPeter Wemm 2516c2aa98e2SPeter Wemm #endif /* SPT_TYPE != SPT_BUILTIN */ 251712ed1c7cSGregory Neil Shapiro /* 251876b7bf71SPeter Wemm ** SM_SETPROCTITLE -- set process task and set process title for ps 251976b7bf71SPeter Wemm ** 252076b7bf71SPeter Wemm ** Possibly set process status and call setproctitle() to 252176b7bf71SPeter Wemm ** change the ps display. 252276b7bf71SPeter Wemm ** 252376b7bf71SPeter Wemm ** Parameters: 252476b7bf71SPeter Wemm ** status -- whether or not to store as process status 25253299c2f1SGregory Neil Shapiro ** e -- the current envelope. 252676b7bf71SPeter Wemm ** fmt -- a printf style format string. 252776b7bf71SPeter Wemm ** a, b, c -- possible parameters to fmt. 252876b7bf71SPeter Wemm ** 252976b7bf71SPeter Wemm ** Returns: 253076b7bf71SPeter Wemm ** none. 253176b7bf71SPeter Wemm */ 253276b7bf71SPeter Wemm 253376b7bf71SPeter Wemm /*VARARGS2*/ 253476b7bf71SPeter Wemm void 253576b7bf71SPeter Wemm #ifdef __STDC__ 25363299c2f1SGregory Neil Shapiro sm_setproctitle(bool status, ENVELOPE *e, const char *fmt, ...) 25373299c2f1SGregory Neil Shapiro #else /* __STDC__ */ 25383299c2f1SGregory Neil Shapiro sm_setproctitle(status, e, fmt, va_alist) 253976b7bf71SPeter Wemm bool status; 25403299c2f1SGregory Neil Shapiro ENVELOPE *e; 254176b7bf71SPeter Wemm const char *fmt; 254276b7bf71SPeter Wemm va_dcl 25433299c2f1SGregory Neil Shapiro #endif /* __STDC__ */ 254476b7bf71SPeter Wemm { 254576b7bf71SPeter Wemm char buf[SPT_BUFSIZE]; 254612ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 25473299c2f1SGregory Neil Shapiro 254876b7bf71SPeter Wemm /* print the argument string */ 254912ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 255012ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(buf, sizeof buf, fmt, ap); 255112ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 255276b7bf71SPeter Wemm 255376b7bf71SPeter Wemm if (status) 255412ed1c7cSGregory Neil Shapiro proc_list_set(CurrentPid, buf); 25553299c2f1SGregory Neil Shapiro 25563299c2f1SGregory Neil Shapiro if (ProcTitlePrefix != NULL) 25573299c2f1SGregory Neil Shapiro { 25583299c2f1SGregory Neil Shapiro char prefix[SPT_BUFSIZE]; 25593299c2f1SGregory Neil Shapiro 25603299c2f1SGregory Neil Shapiro expand(ProcTitlePrefix, prefix, sizeof prefix, e); 25613299c2f1SGregory Neil Shapiro setproctitle("%s: %s", prefix, buf); 25623299c2f1SGregory Neil Shapiro } 25633299c2f1SGregory Neil Shapiro else 256476b7bf71SPeter Wemm setproctitle("%s", buf); 256576b7bf71SPeter Wemm } 256612ed1c7cSGregory Neil Shapiro /* 2567c2aa98e2SPeter Wemm ** WAITFOR -- wait for a particular process id. 2568c2aa98e2SPeter Wemm ** 2569c2aa98e2SPeter Wemm ** Parameters: 2570c2aa98e2SPeter Wemm ** pid -- process id to wait for. 2571c2aa98e2SPeter Wemm ** 2572c2aa98e2SPeter Wemm ** Returns: 2573c2aa98e2SPeter Wemm ** status of pid. 2574c2aa98e2SPeter Wemm ** -1 if pid never shows up. 2575c2aa98e2SPeter Wemm ** 2576c2aa98e2SPeter Wemm ** Side Effects: 2577c2aa98e2SPeter Wemm ** none. 2578c2aa98e2SPeter Wemm */ 2579c2aa98e2SPeter Wemm 2580c2aa98e2SPeter Wemm int 2581c2aa98e2SPeter Wemm waitfor(pid) 2582c2aa98e2SPeter Wemm pid_t pid; 2583c2aa98e2SPeter Wemm { 258412ed1c7cSGregory Neil Shapiro int st; 258512ed1c7cSGregory Neil Shapiro pid_t i; 258612ed1c7cSGregory Neil Shapiro 258712ed1c7cSGregory Neil Shapiro do 258812ed1c7cSGregory Neil Shapiro { 258912ed1c7cSGregory Neil Shapiro errno = 0; 259012ed1c7cSGregory Neil Shapiro i = sm_wait(&st); 259112ed1c7cSGregory Neil Shapiro if (i > 0) 259212ed1c7cSGregory Neil Shapiro proc_list_drop(i, st, NULL); 259312ed1c7cSGregory Neil Shapiro } while ((i >= 0 || errno == EINTR) && i != pid); 259412ed1c7cSGregory Neil Shapiro if (i < 0) 259512ed1c7cSGregory Neil Shapiro return -1; 259612ed1c7cSGregory Neil Shapiro return st; 259712ed1c7cSGregory Neil Shapiro } 259812ed1c7cSGregory Neil Shapiro /* 259912ed1c7cSGregory Neil Shapiro ** SM_WAIT -- wait 260012ed1c7cSGregory Neil Shapiro ** 260112ed1c7cSGregory Neil Shapiro ** Parameters: 260212ed1c7cSGregory Neil Shapiro ** status -- pointer to status (return value) 260312ed1c7cSGregory Neil Shapiro ** 260412ed1c7cSGregory Neil Shapiro ** Returns: 260512ed1c7cSGregory Neil Shapiro ** pid 260612ed1c7cSGregory Neil Shapiro */ 260712ed1c7cSGregory Neil Shapiro 260812ed1c7cSGregory Neil Shapiro pid_t 260912ed1c7cSGregory Neil Shapiro sm_wait(status) 261012ed1c7cSGregory Neil Shapiro int *status; 261112ed1c7cSGregory Neil Shapiro { 2612c2aa98e2SPeter Wemm # ifdef WAITUNION 2613c2aa98e2SPeter Wemm union wait st; 26143299c2f1SGregory Neil Shapiro # else /* WAITUNION */ 2615c2aa98e2SPeter Wemm auto int st; 26163299c2f1SGregory Neil Shapiro # endif /* WAITUNION */ 2617c2aa98e2SPeter Wemm pid_t i; 2618c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 2619c2aa98e2SPeter Wemm int savesig; 26203299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2621c2aa98e2SPeter Wemm 2622c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 262312ed1c7cSGregory Neil Shapiro savesig = sm_releasesignal(SIGCHLD); 26243299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2625c2aa98e2SPeter Wemm i = wait(&st); 2626c2aa98e2SPeter Wemm # if defined(ISC_UNIX) || defined(_SCO_unix_) 2627c2aa98e2SPeter Wemm if (savesig > 0) 262812ed1c7cSGregory Neil Shapiro sm_blocksignal(SIGCHLD); 26293299c2f1SGregory Neil Shapiro # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */ 2630c2aa98e2SPeter Wemm # ifdef WAITUNION 263112ed1c7cSGregory Neil Shapiro *status = st.w_status; 26323299c2f1SGregory Neil Shapiro # else /* WAITUNION */ 263312ed1c7cSGregory Neil Shapiro *status = st; 26343299c2f1SGregory Neil Shapiro # endif /* WAITUNION */ 263512ed1c7cSGregory Neil Shapiro return i; 2636c2aa98e2SPeter Wemm } 263712ed1c7cSGregory Neil Shapiro /* 2638c2aa98e2SPeter Wemm ** REAPCHILD -- pick up the body of my child, lest it become a zombie 2639c2aa98e2SPeter Wemm ** 2640c2aa98e2SPeter Wemm ** Parameters: 2641c2aa98e2SPeter Wemm ** sig -- the signal that got us here (unused). 2642c2aa98e2SPeter Wemm ** 2643c2aa98e2SPeter Wemm ** Returns: 2644c2aa98e2SPeter Wemm ** none. 2645c2aa98e2SPeter Wemm ** 2646c2aa98e2SPeter Wemm ** Side Effects: 2647c2aa98e2SPeter Wemm ** Picks up extant zombies. 26483299c2f1SGregory Neil Shapiro ** Control socket exits may restart/shutdown daemon. 2649c0c4794dSGregory Neil Shapiro ** 2650c0c4794dSGregory Neil Shapiro ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD 2651c0c4794dSGregory Neil Shapiro ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE 2652c0c4794dSGregory Neil Shapiro ** DOING. 2653c2aa98e2SPeter Wemm */ 2654c2aa98e2SPeter Wemm 26553299c2f1SGregory Neil Shapiro /* ARGSUSED0 */ 2656c2aa98e2SPeter Wemm SIGFUNC_DECL 2657c2aa98e2SPeter Wemm reapchild(sig) 2658c2aa98e2SPeter Wemm int sig; 2659c2aa98e2SPeter Wemm { 26603299c2f1SGregory Neil Shapiro int save_errno = errno; 26613299c2f1SGregory Neil Shapiro int st; 2662c2aa98e2SPeter Wemm pid_t pid; 26633299c2f1SGregory Neil Shapiro # if HASWAITPID 2664c2aa98e2SPeter Wemm auto int status; 2665c2aa98e2SPeter Wemm int count; 2666c2aa98e2SPeter Wemm 2667c2aa98e2SPeter Wemm count = 0; 2668c2aa98e2SPeter Wemm while ((pid = waitpid(-1, &status, WNOHANG)) > 0) 2669c2aa98e2SPeter Wemm { 26703299c2f1SGregory Neil Shapiro st = status; 2671c2aa98e2SPeter Wemm if (count++ > 1000) 2672c2aa98e2SPeter Wemm break; 26733299c2f1SGregory Neil Shapiro # else /* HASWAITPID */ 2674c2aa98e2SPeter Wemm # ifdef WNOHANG 267512ed1c7cSGregory Neil Shapiro union wait status; 267612ed1c7cSGregory Neil Shapiro 2677c2aa98e2SPeter Wemm while ((pid = wait3(&status, WNOHANG, (struct rusage *) NULL)) > 0) 26783299c2f1SGregory Neil Shapiro { 26793299c2f1SGregory Neil Shapiro st = status.w_status; 2680c2aa98e2SPeter Wemm # else /* WNOHANG */ 268112ed1c7cSGregory Neil Shapiro auto int status; 268212ed1c7cSGregory Neil Shapiro 2683c2aa98e2SPeter Wemm /* 2684c2aa98e2SPeter Wemm ** Catch one zombie -- we will be re-invoked (we hope) if there 2685c2aa98e2SPeter Wemm ** are more. Unreliable signals probably break this, but this 2686c2aa98e2SPeter Wemm ** is the "old system" situation -- waitpid or wait3 are to be 2687c2aa98e2SPeter Wemm ** strongly preferred. 2688c2aa98e2SPeter Wemm */ 2689c2aa98e2SPeter Wemm 2690c2aa98e2SPeter Wemm if ((pid = wait(&status)) > 0) 26913299c2f1SGregory Neil Shapiro { 26923299c2f1SGregory Neil Shapiro st = status; 2693c2aa98e2SPeter Wemm # endif /* WNOHANG */ 26943299c2f1SGregory Neil Shapiro # endif /* HASWAITPID */ 26953299c2f1SGregory Neil Shapiro /* Drop PID and check if it was a control socket child */ 269612ed1c7cSGregory Neil Shapiro proc_list_drop(pid, st, NULL); 26973299c2f1SGregory Neil Shapiro } 2698c0c4794dSGregory Neil Shapiro FIX_SYSV_SIGNAL(sig, reapchild); 26993299c2f1SGregory Neil Shapiro errno = save_errno; 2700c2aa98e2SPeter Wemm return SIGFUNC_RETURN; 2701c2aa98e2SPeter Wemm } 2702c2aa98e2SPeter Wemm /* 2703c2aa98e2SPeter Wemm ** GETDTABLESIZE -- return number of file descriptors 2704c2aa98e2SPeter Wemm ** 2705c2aa98e2SPeter Wemm ** Only on non-BSD systems 2706c2aa98e2SPeter Wemm ** 2707c2aa98e2SPeter Wemm ** Parameters: 2708c2aa98e2SPeter Wemm ** none 2709c2aa98e2SPeter Wemm ** 2710c2aa98e2SPeter Wemm ** Returns: 2711c2aa98e2SPeter Wemm ** size of file descriptor table 2712c2aa98e2SPeter Wemm ** 2713c2aa98e2SPeter Wemm ** Side Effects: 2714c2aa98e2SPeter Wemm ** none 2715c2aa98e2SPeter Wemm */ 2716c2aa98e2SPeter Wemm 2717c2aa98e2SPeter Wemm #ifdef SOLARIS 2718c2aa98e2SPeter Wemm # include <sys/resource.h> 27193299c2f1SGregory Neil Shapiro #endif /* SOLARIS */ 2720c2aa98e2SPeter Wemm 2721c2aa98e2SPeter Wemm int 2722c2aa98e2SPeter Wemm getdtsize() 2723c2aa98e2SPeter Wemm { 2724c2aa98e2SPeter Wemm # ifdef RLIMIT_NOFILE 2725c2aa98e2SPeter Wemm struct rlimit rl; 2726c2aa98e2SPeter Wemm 2727c2aa98e2SPeter Wemm if (getrlimit(RLIMIT_NOFILE, &rl) >= 0) 2728c2aa98e2SPeter Wemm return rl.rlim_cur; 27293299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NOFILE */ 2730c2aa98e2SPeter Wemm 27313299c2f1SGregory Neil Shapiro # if HASGETDTABLESIZE 2732c2aa98e2SPeter Wemm return getdtablesize(); 27333299c2f1SGregory Neil Shapiro # else /* HASGETDTABLESIZE */ 2734c2aa98e2SPeter Wemm # ifdef _SC_OPEN_MAX 2735c2aa98e2SPeter Wemm return sysconf(_SC_OPEN_MAX); 27363299c2f1SGregory Neil Shapiro # else /* _SC_OPEN_MAX */ 2737c2aa98e2SPeter Wemm return NOFILE; 27383299c2f1SGregory Neil Shapiro # endif /* _SC_OPEN_MAX */ 27393299c2f1SGregory Neil Shapiro # endif /* HASGETDTABLESIZE */ 2740c2aa98e2SPeter Wemm } 274112ed1c7cSGregory Neil Shapiro /* 2742c2aa98e2SPeter Wemm ** UNAME -- get the UUCP name of this system. 2743c2aa98e2SPeter Wemm */ 2744c2aa98e2SPeter Wemm 27453299c2f1SGregory Neil Shapiro #if !HASUNAME 2746c2aa98e2SPeter Wemm 2747c2aa98e2SPeter Wemm int 2748c2aa98e2SPeter Wemm uname(name) 2749c2aa98e2SPeter Wemm struct utsname *name; 2750c2aa98e2SPeter Wemm { 275112ed1c7cSGregory Neil Shapiro SM_FILE_T *file; 2752c2aa98e2SPeter Wemm char *n; 2753c2aa98e2SPeter Wemm 2754c2aa98e2SPeter Wemm name->nodename[0] = '\0'; 2755c2aa98e2SPeter Wemm 2756c2aa98e2SPeter Wemm /* try /etc/whoami -- one line with the node name */ 275712ed1c7cSGregory Neil Shapiro if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, "/etc/whoami", 275812ed1c7cSGregory Neil Shapiro SM_IO_RDONLY, NULL)) != NULL) 2759c2aa98e2SPeter Wemm { 276012ed1c7cSGregory Neil Shapiro (void) sm_io_fgets(file, SM_TIME_DEFAULT, name->nodename, 276112ed1c7cSGregory Neil Shapiro NODE_LENGTH + 1); 276212ed1c7cSGregory Neil Shapiro (void) sm_io_close(file, SM_TIME_DEFAULT); 2763c2aa98e2SPeter Wemm n = strchr(name->nodename, '\n'); 2764c2aa98e2SPeter Wemm if (n != NULL) 2765c2aa98e2SPeter Wemm *n = '\0'; 2766c2aa98e2SPeter Wemm if (name->nodename[0] != '\0') 27673299c2f1SGregory Neil Shapiro return 0; 2768c2aa98e2SPeter Wemm } 2769c2aa98e2SPeter Wemm 2770c2aa98e2SPeter Wemm /* try /usr/include/whoami.h -- has a #define somewhere */ 277112ed1c7cSGregory Neil Shapiro if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, 277212ed1c7cSGregory Neil Shapiro "/usr/include/whoami.h", SM_IO_RDONLY, NULL)) 277312ed1c7cSGregory Neil Shapiro != NULL) 2774c2aa98e2SPeter Wemm { 2775c2aa98e2SPeter Wemm char buf[MAXLINE]; 2776c2aa98e2SPeter Wemm 277788ad41d4SGregory Neil Shapiro while (sm_io_fgets(file, SM_TIME_DEFAULT, 277888ad41d4SGregory Neil Shapiro buf, sizeof buf) != NULL) 27793299c2f1SGregory Neil Shapiro { 278012ed1c7cSGregory Neil Shapiro if (sm_io_sscanf(buf, "#define sysname \"%*[^\"]\"", 2781c2aa98e2SPeter Wemm NODE_LENGTH, name->nodename) > 0) 2782c2aa98e2SPeter Wemm break; 27833299c2f1SGregory Neil Shapiro } 278412ed1c7cSGregory Neil Shapiro (void) sm_io_close(file, SM_TIME_DEFAULT); 2785c2aa98e2SPeter Wemm if (name->nodename[0] != '\0') 27863299c2f1SGregory Neil Shapiro return 0; 2787c2aa98e2SPeter Wemm } 2788c2aa98e2SPeter Wemm 27893299c2f1SGregory Neil Shapiro # if 0 2790c2aa98e2SPeter Wemm /* 2791c2aa98e2SPeter Wemm ** Popen is known to have security holes. 2792c2aa98e2SPeter Wemm */ 2793c2aa98e2SPeter Wemm 2794c2aa98e2SPeter Wemm /* try uuname -l to return local name */ 2795c2aa98e2SPeter Wemm if ((file = popen("uuname -l", "r")) != NULL) 2796c2aa98e2SPeter Wemm { 279712ed1c7cSGregory Neil Shapiro (void) sm_io_fgets(file, SM_TIME_DEFAULT, name, 279812ed1c7cSGregory Neil Shapiro NODE_LENGTH + 1); 2799c2aa98e2SPeter Wemm (void) pclose(file); 2800c2aa98e2SPeter Wemm n = strchr(name, '\n'); 2801c2aa98e2SPeter Wemm if (n != NULL) 2802c2aa98e2SPeter Wemm *n = '\0'; 2803c2aa98e2SPeter Wemm if (name->nodename[0] != '\0') 28043299c2f1SGregory Neil Shapiro return 0; 2805c2aa98e2SPeter Wemm } 28063299c2f1SGregory Neil Shapiro # endif /* 0 */ 2807c2aa98e2SPeter Wemm 28083299c2f1SGregory Neil Shapiro return -1; 2809c2aa98e2SPeter Wemm } 28103299c2f1SGregory Neil Shapiro #endif /* !HASUNAME */ 281112ed1c7cSGregory Neil Shapiro /* 2812c2aa98e2SPeter Wemm ** INITGROUPS -- initialize groups 2813c2aa98e2SPeter Wemm ** 2814c2aa98e2SPeter Wemm ** Stub implementation for System V style systems 2815c2aa98e2SPeter Wemm */ 2816c2aa98e2SPeter Wemm 28173299c2f1SGregory Neil Shapiro #if !HASINITGROUPS 2818c2aa98e2SPeter Wemm 2819c2aa98e2SPeter Wemm initgroups(name, basegid) 2820c2aa98e2SPeter Wemm char *name; 2821c2aa98e2SPeter Wemm int basegid; 2822c2aa98e2SPeter Wemm { 2823c2aa98e2SPeter Wemm return 0; 2824c2aa98e2SPeter Wemm } 2825c2aa98e2SPeter Wemm 28263299c2f1SGregory Neil Shapiro #endif /* !HASINITGROUPS */ 282712ed1c7cSGregory Neil Shapiro /* 2828c2aa98e2SPeter Wemm ** SETGROUPS -- set group list 2829c2aa98e2SPeter Wemm ** 2830c2aa98e2SPeter Wemm ** Stub implementation for systems that don't have group lists 2831c2aa98e2SPeter Wemm */ 2832c2aa98e2SPeter Wemm 2833c2aa98e2SPeter Wemm #ifndef NGROUPS_MAX 2834c2aa98e2SPeter Wemm 2835c2aa98e2SPeter Wemm int 2836c2aa98e2SPeter Wemm setgroups(ngroups, grouplist) 2837c2aa98e2SPeter Wemm int ngroups; 2838c2aa98e2SPeter Wemm GIDSET_T grouplist[]; 2839c2aa98e2SPeter Wemm { 2840c2aa98e2SPeter Wemm return 0; 2841c2aa98e2SPeter Wemm } 2842c2aa98e2SPeter Wemm 28433299c2f1SGregory Neil Shapiro #endif /* ! NGROUPS_MAX */ 284412ed1c7cSGregory Neil Shapiro /* 2845c2aa98e2SPeter Wemm ** SETSID -- set session id (for non-POSIX systems) 2846c2aa98e2SPeter Wemm */ 2847c2aa98e2SPeter Wemm 28483299c2f1SGregory Neil Shapiro #if !HASSETSID 2849c2aa98e2SPeter Wemm 2850c2aa98e2SPeter Wemm pid_t 2851c2aa98e2SPeter Wemm setsid __P ((void)) 2852c2aa98e2SPeter Wemm { 2853c2aa98e2SPeter Wemm # ifdef TIOCNOTTY 2854c2aa98e2SPeter Wemm int fd; 2855c2aa98e2SPeter Wemm 2856c2aa98e2SPeter Wemm fd = open("/dev/tty", O_RDWR, 0); 2857c2aa98e2SPeter Wemm if (fd >= 0) 2858c2aa98e2SPeter Wemm { 2859d995d2baSGregory Neil Shapiro (void) ioctl(fd, TIOCNOTTY, (char *) 0); 2860c2aa98e2SPeter Wemm (void) close(fd); 2861c2aa98e2SPeter Wemm } 2862c2aa98e2SPeter Wemm # endif /* TIOCNOTTY */ 2863c2aa98e2SPeter Wemm # ifdef SYS5SETPGRP 2864c2aa98e2SPeter Wemm return setpgrp(); 28653299c2f1SGregory Neil Shapiro # else /* SYS5SETPGRP */ 286612ed1c7cSGregory Neil Shapiro return setpgid(0, CurrentPid); 28673299c2f1SGregory Neil Shapiro # endif /* SYS5SETPGRP */ 2868c2aa98e2SPeter Wemm } 2869c2aa98e2SPeter Wemm 28703299c2f1SGregory Neil Shapiro #endif /* !HASSETSID */ 287112ed1c7cSGregory Neil Shapiro /* 2872c2aa98e2SPeter Wemm ** FSYNC -- dummy fsync 2873c2aa98e2SPeter Wemm */ 2874c2aa98e2SPeter Wemm 28753299c2f1SGregory Neil Shapiro #if NEEDFSYNC 2876c2aa98e2SPeter Wemm 2877c2aa98e2SPeter Wemm fsync(fd) 2878c2aa98e2SPeter Wemm int fd; 2879c2aa98e2SPeter Wemm { 2880c2aa98e2SPeter Wemm # ifdef O_SYNC 2881c2aa98e2SPeter Wemm return fcntl(fd, F_SETFL, O_SYNC); 28823299c2f1SGregory Neil Shapiro # else /* O_SYNC */ 2883c2aa98e2SPeter Wemm /* nothing we can do */ 2884c2aa98e2SPeter Wemm return 0; 28853299c2f1SGregory Neil Shapiro # endif /* O_SYNC */ 2886c2aa98e2SPeter Wemm } 2887c2aa98e2SPeter Wemm 28883299c2f1SGregory Neil Shapiro #endif /* NEEDFSYNC */ 288912ed1c7cSGregory Neil Shapiro /* 2890c2aa98e2SPeter Wemm ** DGUX_INET_ADDR -- inet_addr for DG/UX 2891c2aa98e2SPeter Wemm ** 2892c2aa98e2SPeter Wemm ** Data General DG/UX version of inet_addr returns a struct in_addr 2893c2aa98e2SPeter Wemm ** instead of a long. This patches things. Only needed on versions 2894c2aa98e2SPeter Wemm ** prior to 5.4.3. 2895c2aa98e2SPeter Wemm */ 2896c2aa98e2SPeter Wemm 2897c2aa98e2SPeter Wemm #ifdef DGUX_5_4_2 2898c2aa98e2SPeter Wemm 2899c2aa98e2SPeter Wemm # undef inet_addr 2900c2aa98e2SPeter Wemm 2901c2aa98e2SPeter Wemm long 2902c2aa98e2SPeter Wemm dgux_inet_addr(host) 2903c2aa98e2SPeter Wemm char *host; 2904c2aa98e2SPeter Wemm { 2905c2aa98e2SPeter Wemm struct in_addr haddr; 2906c2aa98e2SPeter Wemm 2907c2aa98e2SPeter Wemm haddr = inet_addr(host); 2908c2aa98e2SPeter Wemm return haddr.s_addr; 2909c2aa98e2SPeter Wemm } 2910c2aa98e2SPeter Wemm 29113299c2f1SGregory Neil Shapiro #endif /* DGUX_5_4_2 */ 291212ed1c7cSGregory Neil Shapiro /* 2913c2aa98e2SPeter Wemm ** GETOPT -- for old systems or systems with bogus implementations 2914c2aa98e2SPeter Wemm */ 2915c2aa98e2SPeter Wemm 291612ed1c7cSGregory Neil Shapiro #if !SM_CONF_GETOPT 2917c2aa98e2SPeter Wemm 2918c2aa98e2SPeter Wemm /* 2919c2aa98e2SPeter Wemm * Copyright (c) 1985 Regents of the University of California. 2920c2aa98e2SPeter Wemm * All rights reserved. The Berkeley software License Agreement 2921c2aa98e2SPeter Wemm * specifies the terms and conditions for redistribution. 2922c2aa98e2SPeter Wemm */ 2923c2aa98e2SPeter Wemm 2924c2aa98e2SPeter Wemm 2925c2aa98e2SPeter Wemm /* 2926c2aa98e2SPeter Wemm ** this version hacked to add `atend' flag to allow state machine 2927c2aa98e2SPeter Wemm ** to reset if invoked by the program to scan args for a 2nd time 2928c2aa98e2SPeter Wemm */ 2929c2aa98e2SPeter Wemm 2930c2aa98e2SPeter Wemm # if defined(LIBC_SCCS) && !defined(lint) 2931c2aa98e2SPeter Wemm static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; 29323299c2f1SGregory Neil Shapiro # endif /* defined(LIBC_SCCS) && !defined(lint) */ 2933c2aa98e2SPeter Wemm 2934c2aa98e2SPeter Wemm /* 293512ed1c7cSGregory Neil Shapiro ** get option letter from argument vector 2936c2aa98e2SPeter Wemm */ 2937c2aa98e2SPeter Wemm # ifdef _CONVEX_SOURCE 2938c2aa98e2SPeter Wemm extern int optind, opterr, optopt; 2939c2aa98e2SPeter Wemm extern char *optarg; 29403299c2f1SGregory Neil Shapiro # else /* _CONVEX_SOURCE */ 2941c2aa98e2SPeter Wemm int opterr = 1; /* if error message should be printed */ 2942c2aa98e2SPeter Wemm int optind = 1; /* index into parent argv vector */ 2943c2aa98e2SPeter Wemm int optopt = 0; /* character checked for validity */ 2944c2aa98e2SPeter Wemm char *optarg = NULL; /* argument associated with option */ 29453299c2f1SGregory Neil Shapiro # endif /* _CONVEX_SOURCE */ 2946c2aa98e2SPeter Wemm 2947c2aa98e2SPeter Wemm # define BADCH (int)'?' 2948c2aa98e2SPeter Wemm # define EMSG "" 294912ed1c7cSGregory Neil Shapiro # define tell(s) if (opterr) \ 295012ed1c7cSGregory Neil Shapiro {sm_io_fputs(smioerr, SM_TIME_DEFAULT, *nargv); \ 295112ed1c7cSGregory Neil Shapiro (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, s); \ 295212ed1c7cSGregory Neil Shapiro (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, optopt); \ 295312ed1c7cSGregory Neil Shapiro (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, '\n'); \ 295412ed1c7cSGregory Neil Shapiro return BADCH;} 2955c2aa98e2SPeter Wemm 2956c2aa98e2SPeter Wemm int 2957c2aa98e2SPeter Wemm getopt(nargc,nargv,ostr) 2958c2aa98e2SPeter Wemm int nargc; 2959c2aa98e2SPeter Wemm char *const *nargv; 2960c2aa98e2SPeter Wemm const char *ostr; 2961c2aa98e2SPeter Wemm { 2962c2aa98e2SPeter Wemm static char *place = EMSG; /* option letter processing */ 2963c2aa98e2SPeter Wemm static char atend = 0; 2964c2aa98e2SPeter Wemm register char *oli = NULL; /* option letter list index */ 2965c2aa98e2SPeter Wemm 2966c2aa98e2SPeter Wemm if (atend) { 2967c2aa98e2SPeter Wemm atend = 0; 2968c2aa98e2SPeter Wemm place = EMSG; 2969c2aa98e2SPeter Wemm } 2970c2aa98e2SPeter Wemm if(!*place) { /* update scanning pointer */ 2971c2aa98e2SPeter Wemm if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) { 2972c2aa98e2SPeter Wemm atend++; 2973c2aa98e2SPeter Wemm return -1; 2974c2aa98e2SPeter Wemm } 2975c2aa98e2SPeter Wemm if (*place == '-') { /* found "--" */ 2976c2aa98e2SPeter Wemm ++optind; 2977c2aa98e2SPeter Wemm atend++; 2978c2aa98e2SPeter Wemm return -1; 2979c2aa98e2SPeter Wemm } 2980c2aa98e2SPeter Wemm } /* option letter okay? */ 2981c2aa98e2SPeter Wemm if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr,optopt))) { 2982c2aa98e2SPeter Wemm if (!*place) ++optind; 2983c2aa98e2SPeter Wemm tell(": illegal option -- "); 2984c2aa98e2SPeter Wemm } 2985c2aa98e2SPeter Wemm if (oli && *++oli != ':') { /* don't need argument */ 2986c2aa98e2SPeter Wemm optarg = NULL; 2987c2aa98e2SPeter Wemm if (!*place) ++optind; 2988c2aa98e2SPeter Wemm } 2989c2aa98e2SPeter Wemm else { /* need an argument */ 2990c2aa98e2SPeter Wemm if (*place) optarg = place; /* no white space */ 2991c2aa98e2SPeter Wemm else if (nargc <= ++optind) { /* no arg */ 2992c2aa98e2SPeter Wemm place = EMSG; 2993c2aa98e2SPeter Wemm tell(": option requires an argument -- "); 2994c2aa98e2SPeter Wemm } 2995c2aa98e2SPeter Wemm else optarg = nargv[optind]; /* white space */ 2996c2aa98e2SPeter Wemm place = EMSG; 2997c2aa98e2SPeter Wemm ++optind; 2998c2aa98e2SPeter Wemm } 299912ed1c7cSGregory Neil Shapiro return optopt; /* dump back option letter */ 3000c2aa98e2SPeter Wemm } 3001c2aa98e2SPeter Wemm 300212ed1c7cSGregory Neil Shapiro #endif /* !SM_CONF_GETOPT */ 300312ed1c7cSGregory Neil Shapiro /* 3004c2aa98e2SPeter Wemm ** USERSHELLOK -- tell if a user's shell is ok for unrestricted use 3005c2aa98e2SPeter Wemm ** 3006c2aa98e2SPeter Wemm ** Parameters: 3007c2aa98e2SPeter Wemm ** user -- the name of the user we are checking. 3008c2aa98e2SPeter Wemm ** shell -- the user's shell from /etc/passwd 3009c2aa98e2SPeter Wemm ** 3010c2aa98e2SPeter Wemm ** Returns: 301112ed1c7cSGregory Neil Shapiro ** true -- if it is ok to use this for unrestricted access. 301212ed1c7cSGregory Neil Shapiro ** false -- if the shell is restricted. 3013c2aa98e2SPeter Wemm */ 3014c2aa98e2SPeter Wemm 3015c2aa98e2SPeter Wemm #if !HASGETUSERSHELL 3016c2aa98e2SPeter Wemm 3017c2aa98e2SPeter Wemm # ifndef _PATH_SHELLS 3018c2aa98e2SPeter Wemm # define _PATH_SHELLS "/etc/shells" 30193299c2f1SGregory Neil Shapiro # endif /* ! _PATH_SHELLS */ 3020c2aa98e2SPeter Wemm 3021c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 3022c2aa98e2SPeter Wemm # include <userconf.h> 3023c2aa98e2SPeter Wemm # if _AIX4 >= 40200 3024c2aa98e2SPeter Wemm # include <userpw.h> 30253299c2f1SGregory Neil Shapiro # endif /* _AIX4 >= 40200 */ 3026c2aa98e2SPeter Wemm # include <usersec.h> 30273299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 3028c2aa98e2SPeter Wemm 30293299c2f1SGregory Neil Shapiro static char *DefaultUserShells[] = 3030c2aa98e2SPeter Wemm { 3031c2aa98e2SPeter Wemm "/bin/sh", /* standard shell */ 303212ed1c7cSGregory Neil Shapiro # ifdef MPE 303312ed1c7cSGregory Neil Shapiro "/SYS/PUB/CI", 303412ed1c7cSGregory Neil Shapiro # else /* MPE */ 3035c2aa98e2SPeter Wemm "/usr/bin/sh", 3036c2aa98e2SPeter Wemm "/bin/csh", /* C shell */ 3037c2aa98e2SPeter Wemm "/usr/bin/csh", 303812ed1c7cSGregory Neil Shapiro # endif /* MPE */ 3039c2aa98e2SPeter Wemm # ifdef __hpux 3040c2aa98e2SPeter Wemm # ifdef V4FS 3041c2aa98e2SPeter Wemm "/usr/bin/rsh", /* restricted Bourne shell */ 3042c2aa98e2SPeter Wemm "/usr/bin/ksh", /* Korn shell */ 3043c2aa98e2SPeter Wemm "/usr/bin/rksh", /* restricted Korn shell */ 3044c2aa98e2SPeter Wemm "/usr/bin/pam", 3045c2aa98e2SPeter Wemm "/usr/bin/keysh", /* key shell (extended Korn shell) */ 3046c2aa98e2SPeter Wemm "/usr/bin/posix/sh", 30473299c2f1SGregory Neil Shapiro # else /* V4FS */ 3048c2aa98e2SPeter Wemm "/bin/rsh", /* restricted Bourne shell */ 3049c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3050c2aa98e2SPeter Wemm "/bin/rksh", /* restricted Korn shell */ 3051c2aa98e2SPeter Wemm "/bin/pam", 3052c2aa98e2SPeter Wemm "/usr/bin/keysh", /* key shell (extended Korn shell) */ 3053c2aa98e2SPeter Wemm "/bin/posix/sh", 3054320f00e7SGregory Neil Shapiro "/sbin/sh" 30553299c2f1SGregory Neil Shapiro # endif /* V4FS */ 30563299c2f1SGregory Neil Shapiro # endif /* __hpux */ 3057c2aa98e2SPeter Wemm # if defined(_AIX3) || defined(_AIX4) 3058c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3059c2aa98e2SPeter Wemm "/usr/bin/ksh", 3060c2aa98e2SPeter Wemm "/bin/tsh", /* trusted shell */ 3061c2aa98e2SPeter Wemm "/usr/bin/tsh", 3062c2aa98e2SPeter Wemm "/bin/bsh", /* Bourne shell */ 3063c2aa98e2SPeter Wemm "/usr/bin/bsh", 30643299c2f1SGregory Neil Shapiro # endif /* defined(_AIX3) || defined(_AIX4) */ 306576b7bf71SPeter Wemm # if defined(__svr4__) || defined(__svr5__) 3066c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3067c2aa98e2SPeter Wemm "/usr/bin/ksh", 30683299c2f1SGregory Neil Shapiro # endif /* defined(__svr4__) || defined(__svr5__) */ 3069c2aa98e2SPeter Wemm # ifdef sgi 3070c2aa98e2SPeter Wemm "/sbin/sh", /* SGI's shells really live in /sbin */ 30719d8fddc1SGregory Neil Shapiro "/usr/bin/sh", 30729d8fddc1SGregory Neil Shapiro "/sbin/bsh", /* classic borne shell */ 30739d8fddc1SGregory Neil Shapiro "/bin/bsh", 30749d8fddc1SGregory Neil Shapiro "/usr/bin/bsh", 30759d8fddc1SGregory Neil Shapiro "/sbin/csh", /* standard csh */ 30769d8fddc1SGregory Neil Shapiro "/bin/csh", 30779d8fddc1SGregory Neil Shapiro "/usr/bin/csh", 30789d8fddc1SGregory Neil Shapiro "/sbin/jsh", /* classic borne shell w/ job control*/ 30799d8fddc1SGregory Neil Shapiro "/bin/jsh", 30809d8fddc1SGregory Neil Shapiro "/usr/bin/jsh", 3081c2aa98e2SPeter Wemm "/bin/ksh", /* Korn shell */ 3082c2aa98e2SPeter Wemm "/sbin/ksh", 3083c2aa98e2SPeter Wemm "/usr/bin/ksh", 30849d8fddc1SGregory Neil Shapiro "/sbin/tcsh", /* Extended csh */ 30859d8fddc1SGregory Neil Shapiro "/bin/tcsh", 3086c2aa98e2SPeter Wemm "/usr/bin/tcsh", 30873299c2f1SGregory Neil Shapiro # endif /* sgi */ 3088c2aa98e2SPeter Wemm NULL 3089c2aa98e2SPeter Wemm }; 3090c2aa98e2SPeter Wemm 30913299c2f1SGregory Neil Shapiro #endif /* !HASGETUSERSHELL */ 3092c2aa98e2SPeter Wemm 3093c2aa98e2SPeter Wemm #define WILDCARD_SHELL "/SENDMAIL/ANY/SHELL/" 3094c2aa98e2SPeter Wemm 3095c2aa98e2SPeter Wemm bool 3096c2aa98e2SPeter Wemm usershellok(user, shell) 3097c2aa98e2SPeter Wemm char *user; 3098c2aa98e2SPeter Wemm char *shell; 3099c2aa98e2SPeter Wemm { 3100c2aa98e2SPeter Wemm # if HASGETUSERSHELL 3101c2aa98e2SPeter Wemm register char *p; 3102c2aa98e2SPeter Wemm extern char *getusershell(); 3103c2aa98e2SPeter Wemm 3104c2aa98e2SPeter Wemm if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || 3105c2aa98e2SPeter Wemm ConfigLevel <= 1) 310612ed1c7cSGregory Neil Shapiro return true; 3107c2aa98e2SPeter Wemm 3108c2aa98e2SPeter Wemm setusershell(); 3109c2aa98e2SPeter Wemm while ((p = getusershell()) != NULL) 3110c2aa98e2SPeter Wemm if (strcmp(p, shell) == 0 || strcmp(p, WILDCARD_SHELL) == 0) 3111c2aa98e2SPeter Wemm break; 3112c2aa98e2SPeter Wemm endusershell(); 3113c2aa98e2SPeter Wemm return p != NULL; 31143299c2f1SGregory Neil Shapiro # else /* HASGETUSERSHELL */ 3115c2aa98e2SPeter Wemm # if USEGETCONFATTR 3116c2aa98e2SPeter Wemm auto char *v; 31173299c2f1SGregory Neil Shapiro # endif /* USEGETCONFATTR */ 311812ed1c7cSGregory Neil Shapiro register SM_FILE_T *shellf; 3119c2aa98e2SPeter Wemm char buf[MAXLINE]; 3120c2aa98e2SPeter Wemm 3121c2aa98e2SPeter Wemm if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || 3122c2aa98e2SPeter Wemm ConfigLevel <= 1) 312312ed1c7cSGregory Neil Shapiro return true; 3124c2aa98e2SPeter Wemm 3125c2aa98e2SPeter Wemm # if USEGETCONFATTR 3126c2aa98e2SPeter Wemm /* 3127c2aa98e2SPeter Wemm ** Naturally IBM has a "better" idea..... 3128c2aa98e2SPeter Wemm ** 3129c2aa98e2SPeter Wemm ** What a crock. This interface isn't documented, it is 3130c2aa98e2SPeter Wemm ** considered part of the security library (-ls), and it 3131c2aa98e2SPeter Wemm ** only works if you are running as root (since the list 3132c2aa98e2SPeter Wemm ** of valid shells is obviously a source of great concern). 3133c2aa98e2SPeter Wemm ** I recommend that you do NOT define USEGETCONFATTR, 3134c2aa98e2SPeter Wemm ** especially since you are going to have to set up an 3135c2aa98e2SPeter Wemm ** /etc/shells anyhow to handle the cases where getconfattr 3136c2aa98e2SPeter Wemm ** fails. 3137c2aa98e2SPeter Wemm */ 3138c2aa98e2SPeter Wemm 3139c2aa98e2SPeter Wemm if (getconfattr(SC_SYS_LOGIN, SC_SHELLS, &v, SEC_LIST) == 0 && v != NULL) 3140c2aa98e2SPeter Wemm { 3141c2aa98e2SPeter Wemm while (*v != '\0') 3142c2aa98e2SPeter Wemm { 3143c2aa98e2SPeter Wemm if (strcmp(v, shell) == 0 || strcmp(v, WILDCARD_SHELL) == 0) 314412ed1c7cSGregory Neil Shapiro return true; 3145c2aa98e2SPeter Wemm v += strlen(v) + 1; 3146c2aa98e2SPeter Wemm } 314712ed1c7cSGregory Neil Shapiro return false; 3148c2aa98e2SPeter Wemm } 31493299c2f1SGregory Neil Shapiro # endif /* USEGETCONFATTR */ 3150c2aa98e2SPeter Wemm 315112ed1c7cSGregory Neil Shapiro shellf = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_SHELLS, 315212ed1c7cSGregory Neil Shapiro SM_IO_RDONLY, NULL); 3153c2aa98e2SPeter Wemm if (shellf == NULL) 3154c2aa98e2SPeter Wemm { 3155c2aa98e2SPeter Wemm /* no /etc/shells; see if it is one of the std shells */ 3156c2aa98e2SPeter Wemm char **d; 3157c2aa98e2SPeter Wemm 3158c2aa98e2SPeter Wemm if (errno != ENOENT && LogLevel > 3) 3159c2aa98e2SPeter Wemm sm_syslog(LOG_ERR, NOQID, 3160c2aa98e2SPeter Wemm "usershellok: cannot open %s: %s", 316112ed1c7cSGregory Neil Shapiro _PATH_SHELLS, sm_errstring(errno)); 3162c2aa98e2SPeter Wemm 3163c2aa98e2SPeter Wemm for (d = DefaultUserShells; *d != NULL; d++) 3164c2aa98e2SPeter Wemm { 3165c2aa98e2SPeter Wemm if (strcmp(shell, *d) == 0) 316612ed1c7cSGregory Neil Shapiro return true; 3167c2aa98e2SPeter Wemm } 316812ed1c7cSGregory Neil Shapiro return false; 3169c2aa98e2SPeter Wemm } 3170c2aa98e2SPeter Wemm 317112ed1c7cSGregory Neil Shapiro while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL) 3172c2aa98e2SPeter Wemm { 3173c2aa98e2SPeter Wemm register char *p, *q; 3174c2aa98e2SPeter Wemm 3175c2aa98e2SPeter Wemm p = buf; 3176c2aa98e2SPeter Wemm while (*p != '\0' && *p != '#' && *p != '/') 3177c2aa98e2SPeter Wemm p++; 3178c2aa98e2SPeter Wemm if (*p == '#' || *p == '\0') 3179c2aa98e2SPeter Wemm continue; 3180c2aa98e2SPeter Wemm q = p; 3181c2aa98e2SPeter Wemm while (*p != '\0' && *p != '#' && !(isascii(*p) && isspace(*p))) 3182c2aa98e2SPeter Wemm p++; 3183c2aa98e2SPeter Wemm *p = '\0'; 3184c2aa98e2SPeter Wemm if (strcmp(shell, q) == 0 || strcmp(WILDCARD_SHELL, q) == 0) 3185c2aa98e2SPeter Wemm { 318612ed1c7cSGregory Neil Shapiro (void) sm_io_close(shellf, SM_TIME_DEFAULT); 318712ed1c7cSGregory Neil Shapiro return true; 3188c2aa98e2SPeter Wemm } 3189c2aa98e2SPeter Wemm } 319012ed1c7cSGregory Neil Shapiro (void) sm_io_close(shellf, SM_TIME_DEFAULT); 319112ed1c7cSGregory Neil Shapiro return false; 31923299c2f1SGregory Neil Shapiro # endif /* HASGETUSERSHELL */ 3193c2aa98e2SPeter Wemm } 319412ed1c7cSGregory Neil Shapiro /* 3195c2aa98e2SPeter Wemm ** FREEDISKSPACE -- see how much free space is on the queue filesystem 3196c2aa98e2SPeter Wemm ** 3197c2aa98e2SPeter Wemm ** Only implemented if you have statfs. 3198c2aa98e2SPeter Wemm ** 3199c2aa98e2SPeter Wemm ** Parameters: 3200c2aa98e2SPeter Wemm ** dir -- the directory in question. 3201c2aa98e2SPeter Wemm ** bsize -- a variable into which the filesystem 3202c2aa98e2SPeter Wemm ** block size is stored. 3203c2aa98e2SPeter Wemm ** 3204c2aa98e2SPeter Wemm ** Returns: 32053299c2f1SGregory Neil Shapiro ** The number of blocks free on the queue filesystem. 3206c2aa98e2SPeter Wemm ** -1 if the statfs call fails. 3207c2aa98e2SPeter Wemm ** 3208c2aa98e2SPeter Wemm ** Side effects: 3209c2aa98e2SPeter Wemm ** Puts the filesystem block size into bsize. 3210c2aa98e2SPeter Wemm */ 3211c2aa98e2SPeter Wemm 3212c2aa98e2SPeter Wemm /* statfs types */ 3213c2aa98e2SPeter Wemm # define SFS_NONE 0 /* no statfs implementation */ 3214c2aa98e2SPeter Wemm # define SFS_USTAT 1 /* use ustat */ 3215c2aa98e2SPeter Wemm # define SFS_4ARGS 2 /* use four-argument statfs call */ 3216c2aa98e2SPeter Wemm # define SFS_VFS 3 /* use <sys/vfs.h> implementation */ 3217c2aa98e2SPeter Wemm # define SFS_MOUNT 4 /* use <sys/mount.h> implementation */ 3218c2aa98e2SPeter Wemm # define SFS_STATFS 5 /* use <sys/statfs.h> implementation */ 3219c2aa98e2SPeter Wemm # define SFS_STATVFS 6 /* use <sys/statvfs.h> implementation */ 3220c2aa98e2SPeter Wemm 3221c2aa98e2SPeter Wemm # ifndef SFS_TYPE 3222c2aa98e2SPeter Wemm # define SFS_TYPE SFS_NONE 32233299c2f1SGregory Neil Shapiro # endif /* ! SFS_TYPE */ 3224c2aa98e2SPeter Wemm 3225c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3226c2aa98e2SPeter Wemm # include <ustat.h> 32273299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3228c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS 3229c2aa98e2SPeter Wemm # include <sys/statfs.h> 32303299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS */ 3231c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_VFS 3232c2aa98e2SPeter Wemm # include <sys/vfs.h> 32333299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_VFS */ 3234c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_MOUNT 3235c2aa98e2SPeter Wemm # include <sys/mount.h> 32363299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_MOUNT */ 3237c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3238c2aa98e2SPeter Wemm # include <sys/statvfs.h> 32393299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 3240c2aa98e2SPeter Wemm 3241c2aa98e2SPeter Wemm long 3242c2aa98e2SPeter Wemm freediskspace(dir, bsize) 3243c2aa98e2SPeter Wemm char *dir; 3244c2aa98e2SPeter Wemm long *bsize; 3245c2aa98e2SPeter Wemm { 324612ed1c7cSGregory Neil Shapiro # if SFS_TYPE == SFS_NONE 324712ed1c7cSGregory Neil Shapiro if (bsize != NULL) 324812ed1c7cSGregory Neil Shapiro *bsize = 4096L; 324912ed1c7cSGregory Neil Shapiro 325012ed1c7cSGregory Neil Shapiro /* assume free space is plentiful */ 325112ed1c7cSGregory Neil Shapiro return (long) LONG_MAX; 325212ed1c7cSGregory Neil Shapiro # else /* SFS_TYPE == SFS_NONE */ 3253c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3254c2aa98e2SPeter Wemm struct ustat fs; 3255c2aa98e2SPeter Wemm struct stat statbuf; 3256c2aa98e2SPeter Wemm # define FSBLOCKSIZE DEV_BSIZE 3257c2aa98e2SPeter Wemm # define SFS_BAVAIL f_tfree 32583299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_USTAT */ 3259c2aa98e2SPeter Wemm # if defined(ultrix) 3260c2aa98e2SPeter Wemm struct fs_data fs; 3261c2aa98e2SPeter Wemm # define SFS_BAVAIL fd_bfreen 3262c2aa98e2SPeter Wemm # define FSBLOCKSIZE 1024L 32633299c2f1SGregory Neil Shapiro # else /* defined(ultrix) */ 3264c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3265c2aa98e2SPeter Wemm struct statvfs fs; 3266c2aa98e2SPeter Wemm # define FSBLOCKSIZE fs.f_frsize 32673299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_STATVFS */ 3268c2aa98e2SPeter Wemm struct statfs fs; 3269c2aa98e2SPeter Wemm # define FSBLOCKSIZE fs.f_bsize 32703299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 32713299c2f1SGregory Neil Shapiro # endif /* defined(ultrix) */ 32723299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3273c2aa98e2SPeter Wemm # ifndef SFS_BAVAIL 3274c2aa98e2SPeter Wemm # define SFS_BAVAIL f_bavail 32753299c2f1SGregory Neil Shapiro # endif /* ! SFS_BAVAIL */ 3276c2aa98e2SPeter Wemm 3277c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_USTAT 3278c2aa98e2SPeter Wemm if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0) 32793299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_USTAT */ 3280c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_4ARGS 3281c2aa98e2SPeter Wemm if (statfs(dir, &fs, sizeof fs, 0) == 0) 32823299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_4ARGS */ 3283c2aa98e2SPeter Wemm # if SFS_TYPE == SFS_STATVFS 3284c2aa98e2SPeter Wemm if (statvfs(dir, &fs) == 0) 32853299c2f1SGregory Neil Shapiro # else /* SFS_TYPE == SFS_STATVFS */ 3286c2aa98e2SPeter Wemm # if defined(ultrix) 3287c2aa98e2SPeter Wemm if (statfs(dir, &fs) > 0) 32883299c2f1SGregory Neil Shapiro # else /* defined(ultrix) */ 3289c2aa98e2SPeter Wemm if (statfs(dir, &fs) == 0) 32903299c2f1SGregory Neil Shapiro # endif /* defined(ultrix) */ 32913299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_STATVFS */ 32923299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_4ARGS */ 32933299c2f1SGregory Neil Shapiro # endif /* SFS_TYPE == SFS_USTAT */ 3294c2aa98e2SPeter Wemm { 3295c2aa98e2SPeter Wemm if (bsize != NULL) 3296c2aa98e2SPeter Wemm *bsize = FSBLOCKSIZE; 3297c2aa98e2SPeter Wemm if (fs.SFS_BAVAIL <= 0) 3298c2aa98e2SPeter Wemm return 0; 3299c2aa98e2SPeter Wemm else if (fs.SFS_BAVAIL > LONG_MAX) 33003299c2f1SGregory Neil Shapiro return (long) LONG_MAX; 3301c2aa98e2SPeter Wemm else 3302c2aa98e2SPeter Wemm return (long) fs.SFS_BAVAIL; 3303c2aa98e2SPeter Wemm } 33043299c2f1SGregory Neil Shapiro return -1; 330512ed1c7cSGregory Neil Shapiro # endif /* SFS_TYPE == SFS_NONE */ 3306c2aa98e2SPeter Wemm } 330712ed1c7cSGregory Neil Shapiro /* 330812ed1c7cSGregory Neil Shapiro ** ENOUGHDISKSPACE -- is there enough free space on the queue file systems? 3309c2aa98e2SPeter Wemm ** 3310c2aa98e2SPeter Wemm ** Parameters: 3311c2aa98e2SPeter Wemm ** msize -- the size to check against. If zero, we don't yet 3312c2aa98e2SPeter Wemm ** know how big the message will be, so just check for 3313c2aa98e2SPeter Wemm ** a "reasonable" amount. 331412ed1c7cSGregory Neil Shapiro ** e -- envelope, or NULL -- controls logging 3315c2aa98e2SPeter Wemm ** 3316c2aa98e2SPeter Wemm ** Returns: 331712ed1c7cSGregory Neil Shapiro ** true if in every queue group there is at least one 331812ed1c7cSGregory Neil Shapiro ** queue directory whose file system contains enough free space. 331912ed1c7cSGregory Neil Shapiro ** false otherwise. 332012ed1c7cSGregory Neil Shapiro ** 332112ed1c7cSGregory Neil Shapiro ** Side Effects: 332212ed1c7cSGregory Neil Shapiro ** If there is not enough disk space and e != NULL 332312ed1c7cSGregory Neil Shapiro ** then sm_syslog is called. 3324c2aa98e2SPeter Wemm */ 3325c2aa98e2SPeter Wemm 3326c2aa98e2SPeter Wemm bool 332712ed1c7cSGregory Neil Shapiro enoughdiskspace(msize, e) 3328c2aa98e2SPeter Wemm long msize; 332912ed1c7cSGregory Neil Shapiro ENVELOPE *e; 3330c2aa98e2SPeter Wemm { 333112ed1c7cSGregory Neil Shapiro int i; 3332c2aa98e2SPeter Wemm 3333c2aa98e2SPeter Wemm if (MinBlocksFree <= 0 && msize <= 0) 3334c2aa98e2SPeter Wemm { 3335c2aa98e2SPeter Wemm if (tTd(4, 80)) 333612ed1c7cSGregory Neil Shapiro sm_dprintf("enoughdiskspace: no threshold\n"); 333712ed1c7cSGregory Neil Shapiro return true; 3338c2aa98e2SPeter Wemm } 3339c2aa98e2SPeter Wemm 334012ed1c7cSGregory Neil Shapiro filesys_update(); 334112ed1c7cSGregory Neil Shapiro for (i = 0; i < NumQueue; ++i) 3342c2aa98e2SPeter Wemm { 334312ed1c7cSGregory Neil Shapiro if (pickqdir(Queue[i], msize, e) < 0) 334412ed1c7cSGregory Neil Shapiro return false; 3345c2aa98e2SPeter Wemm } 334612ed1c7cSGregory Neil Shapiro return true; 3347c2aa98e2SPeter Wemm } 334812ed1c7cSGregory Neil Shapiro /* 3349c2aa98e2SPeter Wemm ** TRANSIENTERROR -- tell if an error code indicates a transient failure 3350c2aa98e2SPeter Wemm ** 3351c2aa98e2SPeter Wemm ** This looks at an errno value and tells if this is likely to 3352c2aa98e2SPeter Wemm ** go away if retried later. 3353c2aa98e2SPeter Wemm ** 3354c2aa98e2SPeter Wemm ** Parameters: 3355c2aa98e2SPeter Wemm ** err -- the errno code to classify. 3356c2aa98e2SPeter Wemm ** 3357c2aa98e2SPeter Wemm ** Returns: 335812ed1c7cSGregory Neil Shapiro ** true if this is probably transient. 335912ed1c7cSGregory Neil Shapiro ** false otherwise. 3360c2aa98e2SPeter Wemm */ 3361c2aa98e2SPeter Wemm 3362c2aa98e2SPeter Wemm bool 3363c2aa98e2SPeter Wemm transienterror(err) 3364c2aa98e2SPeter Wemm int err; 3365c2aa98e2SPeter Wemm { 3366c2aa98e2SPeter Wemm switch (err) 3367c2aa98e2SPeter Wemm { 3368c2aa98e2SPeter Wemm case EIO: /* I/O error */ 3369c2aa98e2SPeter Wemm case ENXIO: /* Device not configured */ 3370c2aa98e2SPeter Wemm case EAGAIN: /* Resource temporarily unavailable */ 3371c2aa98e2SPeter Wemm case ENOMEM: /* Cannot allocate memory */ 3372c2aa98e2SPeter Wemm case ENODEV: /* Operation not supported by device */ 3373c2aa98e2SPeter Wemm case ENFILE: /* Too many open files in system */ 3374c2aa98e2SPeter Wemm case EMFILE: /* Too many open files */ 3375c2aa98e2SPeter Wemm case ENOSPC: /* No space left on device */ 3376c2aa98e2SPeter Wemm case ETIMEDOUT: /* Connection timed out */ 3377c2aa98e2SPeter Wemm #ifdef ESTALE 3378c2aa98e2SPeter Wemm case ESTALE: /* Stale NFS file handle */ 33793299c2f1SGregory Neil Shapiro #endif /* ESTALE */ 3380c2aa98e2SPeter Wemm #ifdef ENETDOWN 3381c2aa98e2SPeter Wemm case ENETDOWN: /* Network is down */ 33823299c2f1SGregory Neil Shapiro #endif /* ENETDOWN */ 3383c2aa98e2SPeter Wemm #ifdef ENETUNREACH 3384c2aa98e2SPeter Wemm case ENETUNREACH: /* Network is unreachable */ 33853299c2f1SGregory Neil Shapiro #endif /* ENETUNREACH */ 3386c2aa98e2SPeter Wemm #ifdef ENETRESET 3387c2aa98e2SPeter Wemm case ENETRESET: /* Network dropped connection on reset */ 33883299c2f1SGregory Neil Shapiro #endif /* ENETRESET */ 3389c2aa98e2SPeter Wemm #ifdef ECONNABORTED 3390c2aa98e2SPeter Wemm case ECONNABORTED: /* Software caused connection abort */ 33913299c2f1SGregory Neil Shapiro #endif /* ECONNABORTED */ 3392c2aa98e2SPeter Wemm #ifdef ECONNRESET 3393c2aa98e2SPeter Wemm case ECONNRESET: /* Connection reset by peer */ 33943299c2f1SGregory Neil Shapiro #endif /* ECONNRESET */ 3395c2aa98e2SPeter Wemm #ifdef ENOBUFS 3396c2aa98e2SPeter Wemm case ENOBUFS: /* No buffer space available */ 33973299c2f1SGregory Neil Shapiro #endif /* ENOBUFS */ 3398c2aa98e2SPeter Wemm #ifdef ESHUTDOWN 3399c2aa98e2SPeter Wemm case ESHUTDOWN: /* Can't send after socket shutdown */ 34003299c2f1SGregory Neil Shapiro #endif /* ESHUTDOWN */ 3401c2aa98e2SPeter Wemm #ifdef ECONNREFUSED 3402c2aa98e2SPeter Wemm case ECONNREFUSED: /* Connection refused */ 34033299c2f1SGregory Neil Shapiro #endif /* ECONNREFUSED */ 3404c2aa98e2SPeter Wemm #ifdef EHOSTDOWN 3405c2aa98e2SPeter Wemm case EHOSTDOWN: /* Host is down */ 34063299c2f1SGregory Neil Shapiro #endif /* EHOSTDOWN */ 3407c2aa98e2SPeter Wemm #ifdef EHOSTUNREACH 3408c2aa98e2SPeter Wemm case EHOSTUNREACH: /* No route to host */ 34093299c2f1SGregory Neil Shapiro #endif /* EHOSTUNREACH */ 3410c2aa98e2SPeter Wemm #ifdef EDQUOT 3411c2aa98e2SPeter Wemm case EDQUOT: /* Disc quota exceeded */ 34123299c2f1SGregory Neil Shapiro #endif /* EDQUOT */ 3413c2aa98e2SPeter Wemm #ifdef EPROCLIM 3414c2aa98e2SPeter Wemm case EPROCLIM: /* Too many processes */ 34153299c2f1SGregory Neil Shapiro #endif /* EPROCLIM */ 3416c2aa98e2SPeter Wemm #ifdef EUSERS 3417c2aa98e2SPeter Wemm case EUSERS: /* Too many users */ 34183299c2f1SGregory Neil Shapiro #endif /* EUSERS */ 3419c2aa98e2SPeter Wemm #ifdef EDEADLK 3420c2aa98e2SPeter Wemm case EDEADLK: /* Resource deadlock avoided */ 34213299c2f1SGregory Neil Shapiro #endif /* EDEADLK */ 3422c2aa98e2SPeter Wemm #ifdef EISCONN 3423c2aa98e2SPeter Wemm case EISCONN: /* Socket already connected */ 34243299c2f1SGregory Neil Shapiro #endif /* EISCONN */ 3425c2aa98e2SPeter Wemm #ifdef EINPROGRESS 3426c2aa98e2SPeter Wemm case EINPROGRESS: /* Operation now in progress */ 34273299c2f1SGregory Neil Shapiro #endif /* EINPROGRESS */ 3428c2aa98e2SPeter Wemm #ifdef EALREADY 3429c2aa98e2SPeter Wemm case EALREADY: /* Operation already in progress */ 34303299c2f1SGregory Neil Shapiro #endif /* EALREADY */ 3431c2aa98e2SPeter Wemm #ifdef EADDRINUSE 3432c2aa98e2SPeter Wemm case EADDRINUSE: /* Address already in use */ 34333299c2f1SGregory Neil Shapiro #endif /* EADDRINUSE */ 3434c2aa98e2SPeter Wemm #ifdef EADDRNOTAVAIL 3435c2aa98e2SPeter Wemm case EADDRNOTAVAIL: /* Can't assign requested address */ 34363299c2f1SGregory Neil Shapiro #endif /* EADDRNOTAVAIL */ 3437c2aa98e2SPeter Wemm #ifdef ETXTBSY 3438c2aa98e2SPeter Wemm case ETXTBSY: /* (Apollo) file locked */ 34393299c2f1SGregory Neil Shapiro #endif /* ETXTBSY */ 3440c2aa98e2SPeter Wemm #if defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) 3441c2aa98e2SPeter Wemm case ENOSR: /* Out of streams resources */ 34423299c2f1SGregory Neil Shapiro #endif /* defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) */ 34433299c2f1SGregory Neil Shapiro #ifdef ENOLCK 34443299c2f1SGregory Neil Shapiro case ENOLCK: /* No locks available */ 34453299c2f1SGregory Neil Shapiro #endif /* ENOLCK */ 3446c2aa98e2SPeter Wemm case E_SM_OPENTIMEOUT: /* PSEUDO: open timed out */ 344712ed1c7cSGregory Neil Shapiro return true; 3448c2aa98e2SPeter Wemm } 3449c2aa98e2SPeter Wemm 3450c2aa98e2SPeter Wemm /* nope, must be permanent */ 345112ed1c7cSGregory Neil Shapiro return false; 3452c2aa98e2SPeter Wemm } 345312ed1c7cSGregory Neil Shapiro /* 3454c2aa98e2SPeter Wemm ** LOCKFILE -- lock a file using flock or (shudder) fcntl locking 3455c2aa98e2SPeter Wemm ** 3456c2aa98e2SPeter Wemm ** Parameters: 3457c2aa98e2SPeter Wemm ** fd -- the file descriptor of the file. 3458c2aa98e2SPeter Wemm ** filename -- the file name (for error messages). 3459c2aa98e2SPeter Wemm ** ext -- the filename extension. 3460c2aa98e2SPeter Wemm ** type -- type of the lock. Bits can be: 3461c2aa98e2SPeter Wemm ** LOCK_EX -- exclusive lock. 3462c2aa98e2SPeter Wemm ** LOCK_NB -- non-blocking. 3463c46d91b7SGregory Neil Shapiro ** LOCK_UN -- unlock. 3464c2aa98e2SPeter Wemm ** 3465c2aa98e2SPeter Wemm ** Returns: 346612ed1c7cSGregory Neil Shapiro ** true if the lock was acquired. 346712ed1c7cSGregory Neil Shapiro ** false otherwise. 3468c2aa98e2SPeter Wemm */ 3469c2aa98e2SPeter Wemm 3470c2aa98e2SPeter Wemm bool 3471c2aa98e2SPeter Wemm lockfile(fd, filename, ext, type) 3472c2aa98e2SPeter Wemm int fd; 3473c2aa98e2SPeter Wemm char *filename; 3474c2aa98e2SPeter Wemm char *ext; 3475c2aa98e2SPeter Wemm int type; 3476c2aa98e2SPeter Wemm { 3477c2aa98e2SPeter Wemm int i; 3478c2aa98e2SPeter Wemm int save_errno; 3479c2aa98e2SPeter Wemm # if !HASFLOCK 3480c2aa98e2SPeter Wemm int action; 3481c2aa98e2SPeter Wemm struct flock lfd; 3482c2aa98e2SPeter Wemm 3483c2aa98e2SPeter Wemm if (ext == NULL) 3484c2aa98e2SPeter Wemm ext = ""; 3485c2aa98e2SPeter Wemm 34863299c2f1SGregory Neil Shapiro memset(&lfd, '\0', sizeof lfd); 3487c2aa98e2SPeter Wemm if (bitset(LOCK_UN, type)) 3488c2aa98e2SPeter Wemm lfd.l_type = F_UNLCK; 3489c2aa98e2SPeter Wemm else if (bitset(LOCK_EX, type)) 3490c2aa98e2SPeter Wemm lfd.l_type = F_WRLCK; 3491c2aa98e2SPeter Wemm else 3492c2aa98e2SPeter Wemm lfd.l_type = F_RDLCK; 3493c2aa98e2SPeter Wemm 3494c2aa98e2SPeter Wemm if (bitset(LOCK_NB, type)) 3495c2aa98e2SPeter Wemm action = F_SETLK; 3496c2aa98e2SPeter Wemm else 3497c2aa98e2SPeter Wemm action = F_SETLKW; 3498c2aa98e2SPeter Wemm 3499c2aa98e2SPeter Wemm if (tTd(55, 60)) 350012ed1c7cSGregory Neil Shapiro sm_dprintf("lockfile(%s%s, action=%d, type=%d): ", 3501c2aa98e2SPeter Wemm filename, ext, action, lfd.l_type); 3502c2aa98e2SPeter Wemm 3503c2aa98e2SPeter Wemm while ((i = fcntl(fd, action, &lfd)) < 0 && errno == EINTR) 3504c2aa98e2SPeter Wemm continue; 3505c2aa98e2SPeter Wemm if (i >= 0) 3506c2aa98e2SPeter Wemm { 3507c2aa98e2SPeter Wemm if (tTd(55, 60)) 350812ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 350912ed1c7cSGregory Neil Shapiro return true; 3510c2aa98e2SPeter Wemm } 3511c2aa98e2SPeter Wemm save_errno = errno; 3512c2aa98e2SPeter Wemm 3513c2aa98e2SPeter Wemm if (tTd(55, 60)) 351412ed1c7cSGregory Neil Shapiro sm_dprintf("(%s) ", sm_errstring(save_errno)); 3515c2aa98e2SPeter Wemm 3516c2aa98e2SPeter Wemm /* 3517c2aa98e2SPeter Wemm ** On SunOS, if you are testing using -oQ/tmp/mqueue or 3518c2aa98e2SPeter Wemm ** -oA/tmp/aliases or anything like that, and /tmp is mounted 3519c2aa98e2SPeter Wemm ** as type "tmp" (that is, served from swap space), the 3520c2aa98e2SPeter Wemm ** previous fcntl will fail with "Invalid argument" errors. 3521c2aa98e2SPeter Wemm ** Since this is fairly common during testing, we will assume 3522c2aa98e2SPeter Wemm ** that this indicates that the lock is successfully grabbed. 3523c2aa98e2SPeter Wemm */ 3524c2aa98e2SPeter Wemm 3525c2aa98e2SPeter Wemm if (save_errno == EINVAL) 3526c2aa98e2SPeter Wemm { 3527c2aa98e2SPeter Wemm if (tTd(55, 60)) 352812ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 352912ed1c7cSGregory Neil Shapiro return true; 3530c2aa98e2SPeter Wemm } 3531c2aa98e2SPeter Wemm 35323299c2f1SGregory Neil Shapiro if (!bitset(LOCK_NB, type) || 35333299c2f1SGregory Neil Shapiro (save_errno != EACCES && save_errno != EAGAIN)) 3534c2aa98e2SPeter Wemm { 3535320f00e7SGregory Neil Shapiro int omode = fcntl(fd, F_GETFL, 0); 3536320f00e7SGregory Neil Shapiro uid_t euid = geteuid(); 3537320f00e7SGregory Neil Shapiro 3538c2aa98e2SPeter Wemm errno = save_errno; 3539c2aa98e2SPeter Wemm syserr("cannot lockf(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", 3540320f00e7SGregory Neil Shapiro filename, ext, fd, type, omode, euid); 354112ed1c7cSGregory Neil Shapiro dumpfd(fd, true, true); 3542c2aa98e2SPeter Wemm } 35433299c2f1SGregory Neil Shapiro # else /* !HASFLOCK */ 3544c2aa98e2SPeter Wemm if (ext == NULL) 3545c2aa98e2SPeter Wemm ext = ""; 3546c2aa98e2SPeter Wemm 3547c2aa98e2SPeter Wemm if (tTd(55, 60)) 354812ed1c7cSGregory Neil Shapiro sm_dprintf("lockfile(%s%s, type=%o): ", filename, ext, type); 3549c2aa98e2SPeter Wemm 3550c2aa98e2SPeter Wemm while ((i = flock(fd, type)) < 0 && errno == EINTR) 3551c2aa98e2SPeter Wemm continue; 3552c2aa98e2SPeter Wemm if (i >= 0) 3553c2aa98e2SPeter Wemm { 3554c2aa98e2SPeter Wemm if (tTd(55, 60)) 355512ed1c7cSGregory Neil Shapiro sm_dprintf("SUCCESS\n"); 355612ed1c7cSGregory Neil Shapiro return true; 3557c2aa98e2SPeter Wemm } 3558c2aa98e2SPeter Wemm save_errno = errno; 3559c2aa98e2SPeter Wemm 3560c2aa98e2SPeter Wemm if (tTd(55, 60)) 356112ed1c7cSGregory Neil Shapiro sm_dprintf("(%s) ", sm_errstring(save_errno)); 3562c2aa98e2SPeter Wemm 3563c2aa98e2SPeter Wemm if (!bitset(LOCK_NB, type) || save_errno != EWOULDBLOCK) 3564c2aa98e2SPeter Wemm { 3565320f00e7SGregory Neil Shapiro int omode = fcntl(fd, F_GETFL, 0); 3566320f00e7SGregory Neil Shapiro uid_t euid = geteuid(); 3567320f00e7SGregory Neil Shapiro 3568c2aa98e2SPeter Wemm errno = save_errno; 3569c2aa98e2SPeter Wemm syserr("cannot flock(%s%s, fd=%d, type=%o, omode=%o, euid=%d)", 3570320f00e7SGregory Neil Shapiro filename, ext, fd, type, omode, euid); 357112ed1c7cSGregory Neil Shapiro dumpfd(fd, true, true); 3572c2aa98e2SPeter Wemm } 35733299c2f1SGregory Neil Shapiro # endif /* !HASFLOCK */ 3574c2aa98e2SPeter Wemm if (tTd(55, 60)) 357512ed1c7cSGregory Neil Shapiro sm_dprintf("FAIL\n"); 3576c2aa98e2SPeter Wemm errno = save_errno; 357712ed1c7cSGregory Neil Shapiro return false; 3578c2aa98e2SPeter Wemm } 357912ed1c7cSGregory Neil Shapiro /* 3580c2aa98e2SPeter Wemm ** CHOWNSAFE -- tell if chown is "safe" (executable only by root) 3581c2aa98e2SPeter Wemm ** 3582c2aa98e2SPeter Wemm ** Unfortunately, given that we can't predict other systems on which 3583c2aa98e2SPeter Wemm ** a remote mounted (NFS) filesystem will be mounted, the answer is 3584c2aa98e2SPeter Wemm ** almost always that this is unsafe. 3585c2aa98e2SPeter Wemm ** 3586c2aa98e2SPeter Wemm ** Note also that many operating systems have non-compliant 3587c2aa98e2SPeter Wemm ** implementations of the _POSIX_CHOWN_RESTRICTED variable and the 3588c2aa98e2SPeter Wemm ** fpathconf() routine. According to IEEE 1003.1-1990, if 3589c2aa98e2SPeter Wemm ** _POSIX_CHOWN_RESTRICTED is defined and not equal to -1, then 3590c2aa98e2SPeter Wemm ** no non-root process can give away the file. However, vendors 3591c2aa98e2SPeter Wemm ** don't take NFS into account, so a comfortable value of 3592c2aa98e2SPeter Wemm ** _POSIX_CHOWN_RESTRICTED tells us nothing. 3593c2aa98e2SPeter Wemm ** 3594c2aa98e2SPeter Wemm ** Also, some systems (e.g., IRIX 6.2) return 1 from fpathconf() 3595c2aa98e2SPeter Wemm ** even on files where chown is not restricted. Many systems get 3596c2aa98e2SPeter Wemm ** this wrong on NFS-based filesystems (that is, they say that chown 3597c2aa98e2SPeter Wemm ** is restricted [safe] on NFS filesystems where it may not be, since 3598c2aa98e2SPeter Wemm ** other systems can access the same filesystem and do file giveaway; 3599c2aa98e2SPeter Wemm ** only the NFS server knows for sure!) Hence, it is important to 3600c2aa98e2SPeter Wemm ** get the value of SAFENFSPATHCONF correct -- it should be defined 3601c2aa98e2SPeter Wemm ** _only_ after testing (see test/t_pathconf.c) a system on an unsafe 3602c2aa98e2SPeter Wemm ** NFS-based filesystem to ensure that you can get meaningful results. 3603c2aa98e2SPeter Wemm ** If in doubt, assume unsafe! 3604c2aa98e2SPeter Wemm ** 3605c2aa98e2SPeter Wemm ** You may also need to tweak IS_SAFE_CHOWN -- it should be a 3606c2aa98e2SPeter Wemm ** condition indicating whether the return from pathconf indicates 3607c2aa98e2SPeter Wemm ** that chown is safe (typically either > 0 or >= 0 -- there isn't 3608c2aa98e2SPeter Wemm ** even any agreement about whether a zero return means that a file 3609c2aa98e2SPeter Wemm ** is or is not safe). It defaults to "> 0". 3610c2aa98e2SPeter Wemm ** 3611c2aa98e2SPeter Wemm ** If the parent directory is safe (writable only by owner back 3612c2aa98e2SPeter Wemm ** to the root) then we can relax slightly and trust fpathconf 3613c2aa98e2SPeter Wemm ** in more circumstances. This is really a crock -- if this is an 3614c2aa98e2SPeter Wemm ** NFS mounted filesystem then we really know nothing about the 3615c2aa98e2SPeter Wemm ** underlying implementation. However, most systems pessimize and 3616c2aa98e2SPeter Wemm ** return an error (EINVAL or EOPNOTSUPP) on NFS filesystems, which 3617c2aa98e2SPeter Wemm ** we interpret as unsafe, as we should. Thus, this heuristic gets 3618c2aa98e2SPeter Wemm ** us into a possible problem only on systems that have a broken 3619c2aa98e2SPeter Wemm ** pathconf implementation and which are also poorly configured 3620c2aa98e2SPeter Wemm ** (have :include: files in group- or world-writable directories). 3621c2aa98e2SPeter Wemm ** 3622c2aa98e2SPeter Wemm ** Parameters: 3623c2aa98e2SPeter Wemm ** fd -- the file descriptor to check. 3624c2aa98e2SPeter Wemm ** safedir -- set if the parent directory is safe. 3625c2aa98e2SPeter Wemm ** 3626c2aa98e2SPeter Wemm ** Returns: 362712ed1c7cSGregory Neil Shapiro ** true -- if the chown(2) operation is "safe" -- that is, 3628c2aa98e2SPeter Wemm ** only root can chown the file to an arbitrary user. 362912ed1c7cSGregory Neil Shapiro ** false -- if an arbitrary user can give away a file. 3630c2aa98e2SPeter Wemm */ 3631c2aa98e2SPeter Wemm 3632c2aa98e2SPeter Wemm #ifndef IS_SAFE_CHOWN 3633c2aa98e2SPeter Wemm # define IS_SAFE_CHOWN > 0 36343299c2f1SGregory Neil Shapiro #endif /* ! IS_SAFE_CHOWN */ 3635c2aa98e2SPeter Wemm 3636c2aa98e2SPeter Wemm bool 3637c2aa98e2SPeter Wemm chownsafe(fd, safedir) 3638c2aa98e2SPeter Wemm int fd; 3639c2aa98e2SPeter Wemm bool safedir; 3640c2aa98e2SPeter Wemm { 3641c2aa98e2SPeter Wemm # if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \ 3642c2aa98e2SPeter Wemm (defined(_PC_CHOWN_RESTRICTED) || defined(_GNU_TYPES_H)) 3643c2aa98e2SPeter Wemm int rval; 3644c2aa98e2SPeter Wemm 3645c2aa98e2SPeter Wemm /* give the system administrator a chance to override */ 36463299c2f1SGregory Neil Shapiro if (bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail)) 364712ed1c7cSGregory Neil Shapiro return true; 3648c2aa98e2SPeter Wemm 3649c2aa98e2SPeter Wemm /* 3650c2aa98e2SPeter Wemm ** Some systems (e.g., SunOS) seem to have the call and the 3651c2aa98e2SPeter Wemm ** #define _PC_CHOWN_RESTRICTED, but don't actually implement 3652c2aa98e2SPeter Wemm ** the call. This heuristic checks for that. 3653c2aa98e2SPeter Wemm */ 3654c2aa98e2SPeter Wemm 3655c2aa98e2SPeter Wemm errno = 0; 3656c2aa98e2SPeter Wemm rval = fpathconf(fd, _PC_CHOWN_RESTRICTED); 3657c2aa98e2SPeter Wemm # if SAFENFSPATHCONF 3658c2aa98e2SPeter Wemm return errno == 0 && rval IS_SAFE_CHOWN; 36593299c2f1SGregory Neil Shapiro # else /* SAFENFSPATHCONF */ 3660c2aa98e2SPeter Wemm return safedir && errno == 0 && rval IS_SAFE_CHOWN; 36613299c2f1SGregory Neil Shapiro # endif /* SAFENFSPATHCONF */ 366212ed1c7cSGregory Neil Shapiro # else /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */ 36633299c2f1SGregory Neil Shapiro return bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail); 366412ed1c7cSGregory Neil Shapiro # endif /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */ 3665c2aa98e2SPeter Wemm } 366612ed1c7cSGregory Neil Shapiro /* 3667c2aa98e2SPeter Wemm ** RESETLIMITS -- reset system controlled resource limits 3668c2aa98e2SPeter Wemm ** 3669c2aa98e2SPeter Wemm ** This is to avoid denial-of-service attacks 3670c2aa98e2SPeter Wemm ** 3671c2aa98e2SPeter Wemm ** Parameters: 3672c2aa98e2SPeter Wemm ** none 3673c2aa98e2SPeter Wemm ** 3674c2aa98e2SPeter Wemm ** Returns: 3675c2aa98e2SPeter Wemm ** none 3676c2aa98e2SPeter Wemm */ 3677c2aa98e2SPeter Wemm 3678c2aa98e2SPeter Wemm #if HASSETRLIMIT 3679c2aa98e2SPeter Wemm # ifdef RLIMIT_NEEDS_SYS_TIME_H 3680c2aa98e2SPeter Wemm # include <sys/time.h> 36813299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NEEDS_SYS_TIME_H */ 3682c2aa98e2SPeter Wemm # include <sys/resource.h> 36833299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 3684c2aa98e2SPeter Wemm #ifndef FD_SETSIZE 3685c2aa98e2SPeter Wemm # define FD_SETSIZE 256 36863299c2f1SGregory Neil Shapiro #endif /* ! FD_SETSIZE */ 3687c2aa98e2SPeter Wemm 3688c2aa98e2SPeter Wemm void 3689c2aa98e2SPeter Wemm resetlimits() 3690c2aa98e2SPeter Wemm { 3691c2aa98e2SPeter Wemm #if HASSETRLIMIT 3692c2aa98e2SPeter Wemm struct rlimit lim; 3693c2aa98e2SPeter Wemm 3694c2aa98e2SPeter Wemm lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; 3695c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_CPU, &lim); 3696c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_FSIZE, &lim); 3697c2aa98e2SPeter Wemm # ifdef RLIMIT_NOFILE 3698c2aa98e2SPeter Wemm lim.rlim_cur = lim.rlim_max = FD_SETSIZE; 3699c2aa98e2SPeter Wemm (void) setrlimit(RLIMIT_NOFILE, &lim); 37003299c2f1SGregory Neil Shapiro # endif /* RLIMIT_NOFILE */ 37013299c2f1SGregory Neil Shapiro #else /* HASSETRLIMIT */ 3702c2aa98e2SPeter Wemm # if HASULIMIT 3703c2aa98e2SPeter Wemm (void) ulimit(2, 0x3fffff); 3704c2aa98e2SPeter Wemm (void) ulimit(4, FD_SETSIZE); 37053299c2f1SGregory Neil Shapiro # endif /* HASULIMIT */ 37063299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 3707c2aa98e2SPeter Wemm errno = 0; 3708c2aa98e2SPeter Wemm } 370912ed1c7cSGregory Neil Shapiro /* 3710c2aa98e2SPeter Wemm ** SETVENDOR -- process vendor code from V configuration line 3711c2aa98e2SPeter Wemm ** 3712c2aa98e2SPeter Wemm ** Parameters: 3713c2aa98e2SPeter Wemm ** vendor -- string representation of vendor. 3714c2aa98e2SPeter Wemm ** 3715c2aa98e2SPeter Wemm ** Returns: 371612ed1c7cSGregory Neil Shapiro ** true -- if ok. 371712ed1c7cSGregory Neil Shapiro ** false -- if vendor code could not be processed. 3718c2aa98e2SPeter Wemm ** 3719c2aa98e2SPeter Wemm ** Side Effects: 3720c2aa98e2SPeter Wemm ** It is reasonable to set mode flags here to tweak 3721c2aa98e2SPeter Wemm ** processing in other parts of the code if necessary. 3722c2aa98e2SPeter Wemm ** For example, if you are a vendor that uses $%y to 3723c2aa98e2SPeter Wemm ** indicate YP lookups, you could enable that here. 3724c2aa98e2SPeter Wemm */ 3725c2aa98e2SPeter Wemm 3726c2aa98e2SPeter Wemm bool 3727c2aa98e2SPeter Wemm setvendor(vendor) 3728c2aa98e2SPeter Wemm char *vendor; 3729c2aa98e2SPeter Wemm { 373012ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, "Berkeley") == 0) 3731c2aa98e2SPeter Wemm { 3732c2aa98e2SPeter Wemm VendorCode = VENDOR_BERKELEY; 373312ed1c7cSGregory Neil Shapiro return true; 3734c2aa98e2SPeter Wemm } 3735c2aa98e2SPeter Wemm 3736c2aa98e2SPeter Wemm /* add vendor extensions here */ 3737c2aa98e2SPeter Wemm 3738c2aa98e2SPeter Wemm #ifdef SUN_EXTENSIONS 373912ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, "Sun") == 0) 3740c2aa98e2SPeter Wemm { 3741c2aa98e2SPeter Wemm VendorCode = VENDOR_SUN; 374212ed1c7cSGregory Neil Shapiro return true; 3743c2aa98e2SPeter Wemm } 37443299c2f1SGregory Neil Shapiro #endif /* SUN_EXTENSIONS */ 3745c2aa98e2SPeter Wemm 374676b7bf71SPeter Wemm #if defined(VENDOR_NAME) && defined(VENDOR_CODE) 374712ed1c7cSGregory Neil Shapiro if (sm_strcasecmp(vendor, VENDOR_NAME) == 0) 374876b7bf71SPeter Wemm { 374976b7bf71SPeter Wemm VendorCode = VENDOR_CODE; 375012ed1c7cSGregory Neil Shapiro return true; 375176b7bf71SPeter Wemm } 37523299c2f1SGregory Neil Shapiro #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */ 375376b7bf71SPeter Wemm 375412ed1c7cSGregory Neil Shapiro return false; 3755c2aa98e2SPeter Wemm } 375612ed1c7cSGregory Neil Shapiro /* 375776b7bf71SPeter Wemm ** GETVENDOR -- return vendor name based on vendor code 375876b7bf71SPeter Wemm ** 375976b7bf71SPeter Wemm ** Parameters: 376076b7bf71SPeter Wemm ** vendorcode -- numeric representation of vendor. 376176b7bf71SPeter Wemm ** 376276b7bf71SPeter Wemm ** Returns: 376376b7bf71SPeter Wemm ** string containing vendor name. 376476b7bf71SPeter Wemm */ 376576b7bf71SPeter Wemm 376676b7bf71SPeter Wemm char * 376776b7bf71SPeter Wemm getvendor(vendorcode) 376876b7bf71SPeter Wemm int vendorcode; 376976b7bf71SPeter Wemm { 377076b7bf71SPeter Wemm #if defined(VENDOR_NAME) && defined(VENDOR_CODE) 377176b7bf71SPeter Wemm /* 377276b7bf71SPeter Wemm ** Can't have the same switch case twice so need to 377376b7bf71SPeter Wemm ** handle VENDOR_CODE outside of switch. It might 377476b7bf71SPeter Wemm ** match one of the existing VENDOR_* codes. 377576b7bf71SPeter Wemm */ 377676b7bf71SPeter Wemm 377776b7bf71SPeter Wemm if (vendorcode == VENDOR_CODE) 377876b7bf71SPeter Wemm return VENDOR_NAME; 37793299c2f1SGregory Neil Shapiro #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */ 378076b7bf71SPeter Wemm 378176b7bf71SPeter Wemm switch (vendorcode) 378276b7bf71SPeter Wemm { 378376b7bf71SPeter Wemm case VENDOR_BERKELEY: 378476b7bf71SPeter Wemm return "Berkeley"; 378576b7bf71SPeter Wemm 378676b7bf71SPeter Wemm case VENDOR_SUN: 378776b7bf71SPeter Wemm return "Sun"; 378876b7bf71SPeter Wemm 378976b7bf71SPeter Wemm case VENDOR_HP: 379076b7bf71SPeter Wemm return "HP"; 379176b7bf71SPeter Wemm 379276b7bf71SPeter Wemm case VENDOR_IBM: 379376b7bf71SPeter Wemm return "IBM"; 379476b7bf71SPeter Wemm 379576b7bf71SPeter Wemm case VENDOR_SENDMAIL: 379676b7bf71SPeter Wemm return "Sendmail"; 379776b7bf71SPeter Wemm 379876b7bf71SPeter Wemm default: 379976b7bf71SPeter Wemm return "Unknown"; 380076b7bf71SPeter Wemm } 380176b7bf71SPeter Wemm } 380212ed1c7cSGregory Neil Shapiro /* 3803c2aa98e2SPeter Wemm ** VENDOR_PRE_DEFAULTS, VENDOR_POST_DEFAULTS -- set vendor-specific defaults 3804c2aa98e2SPeter Wemm ** 3805c2aa98e2SPeter Wemm ** Vendor_pre_defaults is called before reading the configuration 3806c2aa98e2SPeter Wemm ** file; vendor_post_defaults is called immediately after. 3807c2aa98e2SPeter Wemm ** 3808c2aa98e2SPeter Wemm ** Parameters: 3809c2aa98e2SPeter Wemm ** e -- the global environment to initialize. 3810c2aa98e2SPeter Wemm ** 3811c2aa98e2SPeter Wemm ** Returns: 3812c2aa98e2SPeter Wemm ** none. 3813c2aa98e2SPeter Wemm */ 3814c2aa98e2SPeter Wemm 3815c2aa98e2SPeter Wemm #if SHARE_V1 3816c2aa98e2SPeter Wemm int DefShareUid; /* default share uid to run as -- unused??? */ 38173299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 3818c2aa98e2SPeter Wemm 3819c2aa98e2SPeter Wemm void 3820c2aa98e2SPeter Wemm vendor_pre_defaults(e) 3821c2aa98e2SPeter Wemm ENVELOPE *e; 3822c2aa98e2SPeter Wemm { 3823c2aa98e2SPeter Wemm #if SHARE_V1 3824c2aa98e2SPeter Wemm /* OTHERUID is defined in shares.h, do not be alarmed */ 3825c2aa98e2SPeter Wemm DefShareUid = OTHERUID; 38263299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 3827c2aa98e2SPeter Wemm #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) 3828c2aa98e2SPeter Wemm sun_pre_defaults(e); 38293299c2f1SGregory Neil Shapiro #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */ 3830c2aa98e2SPeter Wemm #ifdef apollo 38313299c2f1SGregory Neil Shapiro /* 38323299c2f1SGregory Neil Shapiro ** stupid domain/os can't even open 38333299c2f1SGregory Neil Shapiro ** /etc/mail/sendmail.cf without this 38343299c2f1SGregory Neil Shapiro */ 38353299c2f1SGregory Neil Shapiro 3836c2aa98e2SPeter Wemm setuserenv("ISP", NULL); 3837c2aa98e2SPeter Wemm setuserenv("SYSTYPE", NULL); 38383299c2f1SGregory Neil Shapiro #endif /* apollo */ 3839c2aa98e2SPeter Wemm } 3840c2aa98e2SPeter Wemm 3841c2aa98e2SPeter Wemm 3842c2aa98e2SPeter Wemm void 3843c2aa98e2SPeter Wemm vendor_post_defaults(e) 3844c2aa98e2SPeter Wemm ENVELOPE *e; 3845c2aa98e2SPeter Wemm { 3846c2aa98e2SPeter Wemm #ifdef __QNX__ 3847c2aa98e2SPeter Wemm char *p; 3848c2aa98e2SPeter Wemm 3849c2aa98e2SPeter Wemm /* Makes sure the SOCK environment variable remains */ 3850c2aa98e2SPeter Wemm if (p = getextenv("SOCK")) 3851c2aa98e2SPeter Wemm setuserenv("SOCK", p); 38523299c2f1SGregory Neil Shapiro #endif /* __QNX__ */ 3853c2aa98e2SPeter Wemm #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) 3854c2aa98e2SPeter Wemm sun_post_defaults(e); 38553299c2f1SGregory Neil Shapiro #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */ 3856c2aa98e2SPeter Wemm } 385712ed1c7cSGregory Neil Shapiro /* 3858c2aa98e2SPeter Wemm ** VENDOR_DAEMON_SETUP -- special vendor setup needed for daemon mode 3859c2aa98e2SPeter Wemm */ 3860c2aa98e2SPeter Wemm 3861c2aa98e2SPeter Wemm void 3862c2aa98e2SPeter Wemm vendor_daemon_setup(e) 3863c2aa98e2SPeter Wemm ENVELOPE *e; 3864c2aa98e2SPeter Wemm { 38653299c2f1SGregory Neil Shapiro #if HASSETLOGIN 38663299c2f1SGregory Neil Shapiro (void) setlogin(RunAsUserName); 38673299c2f1SGregory Neil Shapiro #endif /* HASSETLOGIN */ 3868c2aa98e2SPeter Wemm #if SECUREWARE 3869c2aa98e2SPeter Wemm if (getluid() != -1) 3870c2aa98e2SPeter Wemm { 3871c2aa98e2SPeter Wemm usrerr("Daemon cannot have LUID"); 387212ed1c7cSGregory Neil Shapiro finis(false, true, EX_USAGE); 3873c2aa98e2SPeter Wemm } 3874c2aa98e2SPeter Wemm #endif /* SECUREWARE */ 3875c2aa98e2SPeter Wemm } 387612ed1c7cSGregory Neil Shapiro /* 3877c2aa98e2SPeter Wemm ** VENDOR_SET_UID -- do setup for setting a user id 3878c2aa98e2SPeter Wemm ** 3879c2aa98e2SPeter Wemm ** This is called when we are still root. 3880c2aa98e2SPeter Wemm ** 3881c2aa98e2SPeter Wemm ** Parameters: 3882c2aa98e2SPeter Wemm ** uid -- the uid we are about to become. 3883c2aa98e2SPeter Wemm ** 3884c2aa98e2SPeter Wemm ** Returns: 3885c2aa98e2SPeter Wemm ** none. 3886c2aa98e2SPeter Wemm */ 3887c2aa98e2SPeter Wemm 3888c2aa98e2SPeter Wemm void 3889c2aa98e2SPeter Wemm vendor_set_uid(uid) 3890c2aa98e2SPeter Wemm UID_T uid; 3891c2aa98e2SPeter Wemm { 3892c2aa98e2SPeter Wemm /* 3893c2aa98e2SPeter Wemm ** We need to setup the share groups (lnodes) 38943299c2f1SGregory Neil Shapiro ** and add auditing information (luid's) 3895c2aa98e2SPeter Wemm ** before we loose our ``root''ness. 3896c2aa98e2SPeter Wemm */ 3897c2aa98e2SPeter Wemm #if SHARE_V1 3898c2aa98e2SPeter Wemm if (setupshares(uid, syserr) != 0) 3899c2aa98e2SPeter Wemm syserr("Unable to set up shares"); 39003299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 3901c2aa98e2SPeter Wemm #if SECUREWARE 3902c2aa98e2SPeter Wemm (void) setup_secure(uid); 39033299c2f1SGregory Neil Shapiro #endif /* SECUREWARE */ 3904c2aa98e2SPeter Wemm } 390512ed1c7cSGregory Neil Shapiro /* 3906c2aa98e2SPeter Wemm ** VALIDATE_CONNECTION -- check connection for rationality 3907c2aa98e2SPeter Wemm ** 3908c2aa98e2SPeter Wemm ** If the connection is rejected, this routine should log an 3909c2aa98e2SPeter Wemm ** appropriate message -- but should never issue any SMTP protocol. 3910c2aa98e2SPeter Wemm ** 3911c2aa98e2SPeter Wemm ** Parameters: 3912c2aa98e2SPeter Wemm ** sap -- a pointer to a SOCKADDR naming the peer. 3913c2aa98e2SPeter Wemm ** hostname -- the name corresponding to sap. 3914c2aa98e2SPeter Wemm ** e -- the current envelope. 3915c2aa98e2SPeter Wemm ** 3916c2aa98e2SPeter Wemm ** Returns: 3917c2aa98e2SPeter Wemm ** error message from rejection. 3918c2aa98e2SPeter Wemm ** NULL if not rejected. 3919c2aa98e2SPeter Wemm */ 3920c2aa98e2SPeter Wemm 3921c2aa98e2SPeter Wemm #if TCPWRAPPERS 3922c2aa98e2SPeter Wemm # include <tcpd.h> 3923c2aa98e2SPeter Wemm 3924c2aa98e2SPeter Wemm /* tcpwrappers does no logging, but you still have to declare these -- ugh */ 3925c2aa98e2SPeter Wemm int allow_severity = LOG_INFO; 3926c2aa98e2SPeter Wemm int deny_severity = LOG_NOTICE; 39273299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 3928c2aa98e2SPeter Wemm 3929c2aa98e2SPeter Wemm char * 3930c2aa98e2SPeter Wemm validate_connection(sap, hostname, e) 3931c2aa98e2SPeter Wemm SOCKADDR *sap; 3932c2aa98e2SPeter Wemm char *hostname; 3933c2aa98e2SPeter Wemm ENVELOPE *e; 3934c2aa98e2SPeter Wemm { 3935c2aa98e2SPeter Wemm #if TCPWRAPPERS 3936c2aa98e2SPeter Wemm char *host; 393712ed1c7cSGregory Neil Shapiro char *addr; 393812ed1c7cSGregory Neil Shapiro extern int hosts_ctl(); 39393299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 3940c2aa98e2SPeter Wemm 3941c2aa98e2SPeter Wemm if (tTd(48, 3)) 394212ed1c7cSGregory Neil Shapiro sm_dprintf("validate_connection(%s, %s)\n", 3943c2aa98e2SPeter Wemm hostname, anynet_ntoa(sap)); 3944c2aa98e2SPeter Wemm 39453299c2f1SGregory Neil Shapiro if (rscheck("check_relay", hostname, anynet_ntoa(sap), 39469d8fddc1SGregory Neil Shapiro e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID) != EX_OK) 3947c2aa98e2SPeter Wemm { 3948c2aa98e2SPeter Wemm static char reject[BUFSIZ*2]; 3949c2aa98e2SPeter Wemm extern char MsgBuf[]; 3950c2aa98e2SPeter Wemm 3951c2aa98e2SPeter Wemm if (tTd(48, 4)) 395212ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: BAD (rscheck)\n"); 3953c2aa98e2SPeter Wemm 39543299c2f1SGregory Neil Shapiro if (strlen(MsgBuf) >= 3) 395512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(reject, MsgBuf, sizeof reject); 3956c2aa98e2SPeter Wemm else 395712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(reject, "Access denied", sizeof reject); 3958c2aa98e2SPeter Wemm 3959c2aa98e2SPeter Wemm return reject; 3960c2aa98e2SPeter Wemm } 3961c2aa98e2SPeter Wemm 3962c2aa98e2SPeter Wemm #if TCPWRAPPERS 3963c2aa98e2SPeter Wemm if (hostname[0] == '[' && hostname[strlen(hostname) - 1] == ']') 3964c2aa98e2SPeter Wemm host = "unknown"; 3965c2aa98e2SPeter Wemm else 3966c2aa98e2SPeter Wemm host = hostname; 396712ed1c7cSGregory Neil Shapiro addr = anynet_ntoa(sap); 396812ed1c7cSGregory Neil Shapiro 396912ed1c7cSGregory Neil Shapiro # if NETINET6 397012ed1c7cSGregory Neil Shapiro /* TCP/Wrappers don't want the IPv6: protocol label */ 397112ed1c7cSGregory Neil Shapiro if (addr != NULL && sm_strncasecmp(addr, "IPv6:", 5) == 0) 397212ed1c7cSGregory Neil Shapiro addr += 5; 397312ed1c7cSGregory Neil Shapiro # endif /* NETINET6 */ 397412ed1c7cSGregory Neil Shapiro 397512ed1c7cSGregory Neil Shapiro if (!hosts_ctl("sendmail", host, addr, STRING_UNKNOWN)) 3976c2aa98e2SPeter Wemm { 3977c2aa98e2SPeter Wemm if (tTd(48, 4)) 397812ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: BAD (tcpwrappers)\n"); 397912ed1c7cSGregory Neil Shapiro if (LogLevel > 3) 39803299c2f1SGregory Neil Shapiro sm_syslog(LOG_NOTICE, e->e_id, 3981c2aa98e2SPeter Wemm "tcpwrappers (%s, %s) rejection", 398212ed1c7cSGregory Neil Shapiro host, addr); 3983c2aa98e2SPeter Wemm return "Access denied"; 3984c2aa98e2SPeter Wemm } 39853299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 3986c2aa98e2SPeter Wemm if (tTd(48, 4)) 398712ed1c7cSGregory Neil Shapiro sm_dprintf(" ... validate_connection: OK\n"); 3988c2aa98e2SPeter Wemm return NULL; 3989c2aa98e2SPeter Wemm } 3990c2aa98e2SPeter Wemm 399112ed1c7cSGregory Neil Shapiro /* 3992c2aa98e2SPeter Wemm ** STRTOL -- convert string to long integer 3993c2aa98e2SPeter Wemm ** 3994c2aa98e2SPeter Wemm ** For systems that don't have it in the C library. 3995c2aa98e2SPeter Wemm ** 3996c2aa98e2SPeter Wemm ** This is taken verbatim from the 4.4-Lite C library. 3997c2aa98e2SPeter Wemm */ 3998c2aa98e2SPeter Wemm 39993299c2f1SGregory Neil Shapiro #if NEEDSTRTOL 4000c2aa98e2SPeter Wemm 4001c2aa98e2SPeter Wemm # if defined(LIBC_SCCS) && !defined(lint) 4002c2aa98e2SPeter Wemm static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; 40033299c2f1SGregory Neil Shapiro # endif /* defined(LIBC_SCCS) && !defined(lint) */ 4004c2aa98e2SPeter Wemm 4005c2aa98e2SPeter Wemm /* 400612ed1c7cSGregory Neil Shapiro ** Convert a string to a long integer. 400712ed1c7cSGregory Neil Shapiro ** 400812ed1c7cSGregory Neil Shapiro ** Ignores `locale' stuff. Assumes that the upper and lower case 400912ed1c7cSGregory Neil Shapiro ** alphabets and digits are each contiguous. 4010c2aa98e2SPeter Wemm */ 4011c2aa98e2SPeter Wemm 4012c2aa98e2SPeter Wemm long 4013c2aa98e2SPeter Wemm strtol(nptr, endptr, base) 4014c2aa98e2SPeter Wemm const char *nptr; 4015c2aa98e2SPeter Wemm char **endptr; 4016c2aa98e2SPeter Wemm register int base; 4017c2aa98e2SPeter Wemm { 4018c2aa98e2SPeter Wemm register const char *s = nptr; 4019c2aa98e2SPeter Wemm register unsigned long acc; 4020c2aa98e2SPeter Wemm register int c; 4021c2aa98e2SPeter Wemm register unsigned long cutoff; 4022c2aa98e2SPeter Wemm register int neg = 0, any, cutlim; 4023c2aa98e2SPeter Wemm 4024c2aa98e2SPeter Wemm /* 402512ed1c7cSGregory Neil Shapiro ** Skip white space and pick up leading +/- sign if any. 402612ed1c7cSGregory Neil Shapiro ** If base is 0, allow 0x for hex and 0 for octal, else 402712ed1c7cSGregory Neil Shapiro ** assume decimal; if base is already 16, allow 0x. 4028c2aa98e2SPeter Wemm */ 4029c2aa98e2SPeter Wemm do { 4030c2aa98e2SPeter Wemm c = *s++; 4031c2aa98e2SPeter Wemm } while (isspace(c)); 4032c2aa98e2SPeter Wemm if (c == '-') { 4033c2aa98e2SPeter Wemm neg = 1; 4034c2aa98e2SPeter Wemm c = *s++; 4035c2aa98e2SPeter Wemm } else if (c == '+') 4036c2aa98e2SPeter Wemm c = *s++; 4037c2aa98e2SPeter Wemm if ((base == 0 || base == 16) && 4038c2aa98e2SPeter Wemm c == '0' && (*s == 'x' || *s == 'X')) { 4039c2aa98e2SPeter Wemm c = s[1]; 4040c2aa98e2SPeter Wemm s += 2; 4041c2aa98e2SPeter Wemm base = 16; 4042c2aa98e2SPeter Wemm } 4043c2aa98e2SPeter Wemm if (base == 0) 4044c2aa98e2SPeter Wemm base = c == '0' ? 8 : 10; 4045c2aa98e2SPeter Wemm 4046c2aa98e2SPeter Wemm /* 404712ed1c7cSGregory Neil Shapiro ** Compute the cutoff value between legal numbers and illegal 404812ed1c7cSGregory Neil Shapiro ** numbers. That is the largest legal value, divided by the 404912ed1c7cSGregory Neil Shapiro ** base. An input number that is greater than this value, if 405012ed1c7cSGregory Neil Shapiro ** followed by a legal input character, is too big. One that 405112ed1c7cSGregory Neil Shapiro ** is equal to this value may be valid or not; the limit 405212ed1c7cSGregory Neil Shapiro ** between valid and invalid numbers is then based on the last 405312ed1c7cSGregory Neil Shapiro ** digit. For instance, if the range for longs is 405412ed1c7cSGregory Neil Shapiro ** [-2147483648..2147483647] and the input base is 10, 405512ed1c7cSGregory Neil Shapiro ** cutoff will be set to 214748364 and cutlim to either 405612ed1c7cSGregory Neil Shapiro ** 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated 405712ed1c7cSGregory Neil Shapiro ** a value > 214748364, or equal but the next digit is > 7 (or 8), 405812ed1c7cSGregory Neil Shapiro ** the number is too big, and we will return a range error. 405912ed1c7cSGregory Neil Shapiro ** 406012ed1c7cSGregory Neil Shapiro ** Set any if any `digits' consumed; make it negative to indicate 406112ed1c7cSGregory Neil Shapiro ** overflow. 4062c2aa98e2SPeter Wemm */ 4063c2aa98e2SPeter Wemm cutoff = neg ? -(unsigned long) LONG_MIN : LONG_MAX; 4064c2aa98e2SPeter Wemm cutlim = cutoff % (unsigned long) base; 4065c2aa98e2SPeter Wemm cutoff /= (unsigned long) base; 4066c2aa98e2SPeter Wemm for (acc = 0, any = 0;; c = *s++) { 4067c2aa98e2SPeter Wemm if (isdigit(c)) 4068c2aa98e2SPeter Wemm c -= '0'; 4069c2aa98e2SPeter Wemm else if (isalpha(c)) 4070c2aa98e2SPeter Wemm c -= isupper(c) ? 'A' - 10 : 'a' - 10; 4071c2aa98e2SPeter Wemm else 4072c2aa98e2SPeter Wemm break; 4073c2aa98e2SPeter Wemm if (c >= base) 4074c2aa98e2SPeter Wemm break; 4075c2aa98e2SPeter Wemm if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) 4076c2aa98e2SPeter Wemm any = -1; 4077c2aa98e2SPeter Wemm else { 4078c2aa98e2SPeter Wemm any = 1; 4079c2aa98e2SPeter Wemm acc *= base; 4080c2aa98e2SPeter Wemm acc += c; 4081c2aa98e2SPeter Wemm } 4082c2aa98e2SPeter Wemm } 4083c2aa98e2SPeter Wemm if (any < 0) { 4084c2aa98e2SPeter Wemm acc = neg ? LONG_MIN : LONG_MAX; 4085c2aa98e2SPeter Wemm errno = ERANGE; 4086c2aa98e2SPeter Wemm } else if (neg) 4087c2aa98e2SPeter Wemm acc = -acc; 4088c2aa98e2SPeter Wemm if (endptr != 0) 4089c2aa98e2SPeter Wemm *endptr = (char *)(any ? s - 1 : nptr); 40903299c2f1SGregory Neil Shapiro return acc; 4091c2aa98e2SPeter Wemm } 4092c2aa98e2SPeter Wemm 40933299c2f1SGregory Neil Shapiro #endif /* NEEDSTRTOL */ 409412ed1c7cSGregory Neil Shapiro /* 4095c2aa98e2SPeter Wemm ** STRSTR -- find first substring in string 4096c2aa98e2SPeter Wemm ** 4097c2aa98e2SPeter Wemm ** Parameters: 4098c2aa98e2SPeter Wemm ** big -- the big (full) string. 4099c2aa98e2SPeter Wemm ** little -- the little (sub) string. 4100c2aa98e2SPeter Wemm ** 4101c2aa98e2SPeter Wemm ** Returns: 4102c2aa98e2SPeter Wemm ** A pointer to the first instance of little in big. 4103c2aa98e2SPeter Wemm ** big if little is the null string. 4104c2aa98e2SPeter Wemm ** NULL if little is not contained in big. 4105c2aa98e2SPeter Wemm */ 4106c2aa98e2SPeter Wemm 41073299c2f1SGregory Neil Shapiro #if NEEDSTRSTR 4108c2aa98e2SPeter Wemm 4109c2aa98e2SPeter Wemm char * 4110c2aa98e2SPeter Wemm strstr(big, little) 4111c2aa98e2SPeter Wemm char *big; 4112c2aa98e2SPeter Wemm char *little; 4113c2aa98e2SPeter Wemm { 4114c2aa98e2SPeter Wemm register char *p = big; 4115c2aa98e2SPeter Wemm int l; 4116c2aa98e2SPeter Wemm 4117c2aa98e2SPeter Wemm if (*little == '\0') 4118c2aa98e2SPeter Wemm return big; 4119c2aa98e2SPeter Wemm l = strlen(little); 4120c2aa98e2SPeter Wemm 4121c2aa98e2SPeter Wemm while ((p = strchr(p, *little)) != NULL) 4122c2aa98e2SPeter Wemm { 4123c2aa98e2SPeter Wemm if (strncmp(p, little, l) == 0) 4124c2aa98e2SPeter Wemm return p; 4125c2aa98e2SPeter Wemm p++; 4126c2aa98e2SPeter Wemm } 4127c2aa98e2SPeter Wemm return NULL; 4128c2aa98e2SPeter Wemm } 4129c2aa98e2SPeter Wemm 41303299c2f1SGregory Neil Shapiro #endif /* NEEDSTRSTR */ 413112ed1c7cSGregory Neil Shapiro /* 4132c2aa98e2SPeter Wemm ** SM_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX 4133c2aa98e2SPeter Wemm ** 4134c2aa98e2SPeter Wemm ** Some operating systems have wierd problems with the gethostbyXXX 4135c2aa98e2SPeter Wemm ** routines. For example, Solaris versions at least through 2.3 4136c2aa98e2SPeter Wemm ** don't properly deliver a canonical h_name field. This tries to 4137c2aa98e2SPeter Wemm ** work around these problems. 41383299c2f1SGregory Neil Shapiro ** 41393299c2f1SGregory Neil Shapiro ** Support IPv6 as well as IPv4. 4140c2aa98e2SPeter Wemm */ 4141c2aa98e2SPeter Wemm 4142c0c4794dSGregory Neil Shapiro #if NETINET6 && NEEDSGETIPNODE 41433299c2f1SGregory Neil Shapiro 41443299c2f1SGregory Neil Shapiro # ifndef AI_DEFAULT 41453299c2f1SGregory Neil Shapiro # define AI_DEFAULT 0 /* dummy */ 41463299c2f1SGregory Neil Shapiro # endif /* ! AI_DEFAULT */ 41473299c2f1SGregory Neil Shapiro # ifndef AI_ADDRCONFIG 41483299c2f1SGregory Neil Shapiro # define AI_ADDRCONFIG 0 /* dummy */ 41493299c2f1SGregory Neil Shapiro # endif /* ! AI_ADDRCONFIG */ 41503299c2f1SGregory Neil Shapiro # ifndef AI_V4MAPPED 41513299c2f1SGregory Neil Shapiro # define AI_V4MAPPED 0 /* dummy */ 41523299c2f1SGregory Neil Shapiro # endif /* ! AI_V4MAPPED */ 41533299c2f1SGregory Neil Shapiro # ifndef AI_ALL 41543299c2f1SGregory Neil Shapiro # define AI_ALL 0 /* dummy */ 41553299c2f1SGregory Neil Shapiro # endif /* ! AI_ALL */ 41563299c2f1SGregory Neil Shapiro 41573299c2f1SGregory Neil Shapiro static struct hostent * 41583299c2f1SGregory Neil Shapiro getipnodebyname(name, family, flags, err) 4159c2aa98e2SPeter Wemm char *name; 41603299c2f1SGregory Neil Shapiro int family; 41613299c2f1SGregory Neil Shapiro int flags; 41623299c2f1SGregory Neil Shapiro int *err; 41633299c2f1SGregory Neil Shapiro { 416412ed1c7cSGregory Neil Shapiro bool resv6 = true; 41653299c2f1SGregory Neil Shapiro struct hostent *h; 41663299c2f1SGregory Neil Shapiro 41673299c2f1SGregory Neil Shapiro if (family == AF_INET6) 41683299c2f1SGregory Neil Shapiro { 41693299c2f1SGregory Neil Shapiro /* From RFC2133, section 6.1 */ 41703299c2f1SGregory Neil Shapiro resv6 = bitset(RES_USE_INET6, _res.options); 41713299c2f1SGregory Neil Shapiro _res.options |= RES_USE_INET6; 41723299c2f1SGregory Neil Shapiro } 4173b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(0); 41743299c2f1SGregory Neil Shapiro h = gethostbyname(name); 417512ed1c7cSGregory Neil Shapiro if (!resv6) 41763299c2f1SGregory Neil Shapiro _res.options &= ~RES_USE_INET6; 417712ed1c7cSGregory Neil Shapiro *err = h_errno; 41783299c2f1SGregory Neil Shapiro return h; 41793299c2f1SGregory Neil Shapiro } 41803299c2f1SGregory Neil Shapiro 41813299c2f1SGregory Neil Shapiro static struct hostent * 41823299c2f1SGregory Neil Shapiro getipnodebyaddr(addr, len, family, err) 41833299c2f1SGregory Neil Shapiro char *addr; 41843299c2f1SGregory Neil Shapiro int len; 41853299c2f1SGregory Neil Shapiro int family; 41863299c2f1SGregory Neil Shapiro int *err; 4187c2aa98e2SPeter Wemm { 4188c2aa98e2SPeter Wemm struct hostent *h; 41893299c2f1SGregory Neil Shapiro 4190b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(0); 41913299c2f1SGregory Neil Shapiro h = gethostbyaddr(addr, len, family); 41923299c2f1SGregory Neil Shapiro *err = h_errno; 41933299c2f1SGregory Neil Shapiro return h; 41943299c2f1SGregory Neil Shapiro } 4195c46d91b7SGregory Neil Shapiro 4196c46d91b7SGregory Neil Shapiro void 4197c46d91b7SGregory Neil Shapiro freehostent(h) 4198c46d91b7SGregory Neil Shapiro struct hostent *h; 4199c46d91b7SGregory Neil Shapiro { 4200c46d91b7SGregory Neil Shapiro /* 4201c46d91b7SGregory Neil Shapiro ** Stub routine -- if they don't have getipnodeby*(), 4202c46d91b7SGregory Neil Shapiro ** they probably don't have the free routine either. 4203c46d91b7SGregory Neil Shapiro */ 4204c46d91b7SGregory Neil Shapiro 4205c46d91b7SGregory Neil Shapiro return; 4206c46d91b7SGregory Neil Shapiro } 420712ed1c7cSGregory Neil Shapiro #endif /* NETINET6 && NEEDSGETIPNODE */ 42083299c2f1SGregory Neil Shapiro 42093299c2f1SGregory Neil Shapiro struct hostent * 42103299c2f1SGregory Neil Shapiro sm_gethostbyname(name, family) 42113299c2f1SGregory Neil Shapiro char *name; 42123299c2f1SGregory Neil Shapiro int family; 42133299c2f1SGregory Neil Shapiro { 4214b4662009SGregory Neil Shapiro int save_errno; 42153299c2f1SGregory Neil Shapiro struct hostent *h = NULL; 4216c2aa98e2SPeter Wemm #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) 4217c2aa98e2SPeter Wemm # if SOLARIS == 20300 || SOLARIS == 203 4218c2aa98e2SPeter Wemm static struct hostent hp; 4219c2aa98e2SPeter Wemm static char buf[1000]; 4220c2aa98e2SPeter Wemm extern struct hostent *_switch_gethostbyname_r(); 4221c2aa98e2SPeter Wemm 4222c2aa98e2SPeter Wemm if (tTd(61, 10)) 422312ed1c7cSGregory Neil Shapiro sm_dprintf("_switch_gethostbyname_r(%s)... ", name); 4224c2aa98e2SPeter Wemm h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); 4225b4662009SGregory Neil Shapiro save_errno = errno; 42263299c2f1SGregory Neil Shapiro # else /* SOLARIS == 20300 || SOLARIS == 203 */ 4227c2aa98e2SPeter Wemm extern struct hostent *__switch_gethostbyname(); 4228c2aa98e2SPeter Wemm 4229c2aa98e2SPeter Wemm if (tTd(61, 10)) 423012ed1c7cSGregory Neil Shapiro sm_dprintf("__switch_gethostbyname(%s)... ", name); 4231c2aa98e2SPeter Wemm h = __switch_gethostbyname(name); 4232b4662009SGregory Neil Shapiro save_errno = errno; 42333299c2f1SGregory Neil Shapiro # endif /* SOLARIS == 20300 || SOLARIS == 203 */ 42343299c2f1SGregory Neil Shapiro #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */ 4235c2aa98e2SPeter Wemm int nmaps; 42363299c2f1SGregory Neil Shapiro # if NETINET6 42373299c2f1SGregory Neil Shapiro int flags = AI_DEFAULT|AI_ALL; 42383299c2f1SGregory Neil Shapiro int err; 42393299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 4240c2aa98e2SPeter Wemm char *maptype[MAXMAPSTACK]; 4241c2aa98e2SPeter Wemm short mapreturn[MAXMAPACTIONS]; 4242c2aa98e2SPeter Wemm char hbuf[MAXNAME]; 4243c2aa98e2SPeter Wemm 4244c2aa98e2SPeter Wemm if (tTd(61, 10)) 424512ed1c7cSGregory Neil Shapiro sm_dprintf("sm_gethostbyname(%s, %d)... ", name, family); 42463299c2f1SGregory Neil Shapiro 42473299c2f1SGregory Neil Shapiro # if NETINET6 42483299c2f1SGregory Neil Shapiro # if ADDRCONFIG_IS_BROKEN 42493299c2f1SGregory Neil Shapiro flags &= ~AI_ADDRCONFIG; 42503299c2f1SGregory Neil Shapiro # endif /* ADDRCONFIG_IS_BROKEN */ 42513299c2f1SGregory Neil Shapiro h = getipnodebyname(name, family, flags, &err); 4252b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 42533299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 4254c2aa98e2SPeter Wemm h = gethostbyname(name); 42553299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 42563299c2f1SGregory Neil Shapiro 42573299c2f1SGregory Neil Shapiro save_errno = errno; 4258c2aa98e2SPeter Wemm if (h == NULL) 4259c2aa98e2SPeter Wemm { 4260c2aa98e2SPeter Wemm if (tTd(61, 10)) 426112ed1c7cSGregory Neil Shapiro sm_dprintf("failure\n"); 4262c2aa98e2SPeter Wemm 4263c2aa98e2SPeter Wemm nmaps = switch_map_find("hosts", maptype, mapreturn); 4264c2aa98e2SPeter Wemm while (--nmaps >= 0) 4265c46d91b7SGregory Neil Shapiro { 4266c2aa98e2SPeter Wemm if (strcmp(maptype[nmaps], "nis") == 0 || 4267c2aa98e2SPeter Wemm strcmp(maptype[nmaps], "files") == 0) 4268c2aa98e2SPeter Wemm break; 4269c46d91b7SGregory Neil Shapiro } 4270c46d91b7SGregory Neil Shapiro 4271c2aa98e2SPeter Wemm if (nmaps >= 0) 4272c2aa98e2SPeter Wemm { 4273c2aa98e2SPeter Wemm /* try short name */ 427412ed1c7cSGregory Neil Shapiro if (strlen(name) > sizeof hbuf - 1) 42753299c2f1SGregory Neil Shapiro { 42763299c2f1SGregory Neil Shapiro errno = save_errno; 4277c2aa98e2SPeter Wemm return NULL; 42783299c2f1SGregory Neil Shapiro } 427912ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(hbuf, name, sizeof hbuf); 4280b4662009SGregory Neil Shapiro (void) shorten_hostname(hbuf); 4281c2aa98e2SPeter Wemm 4282c2aa98e2SPeter Wemm /* if it hasn't been shortened, there's no point */ 4283c2aa98e2SPeter Wemm if (strcmp(hbuf, name) != 0) 4284c2aa98e2SPeter Wemm { 4285c2aa98e2SPeter Wemm if (tTd(61, 10)) 428612ed1c7cSGregory Neil Shapiro sm_dprintf("sm_gethostbyname(%s, %d)... ", 42873299c2f1SGregory Neil Shapiro hbuf, family); 42883299c2f1SGregory Neil Shapiro 42893299c2f1SGregory Neil Shapiro # if NETINET6 42906dbce3c3SGregory Neil Shapiro h = getipnodebyname(hbuf, family, flags, &err); 4291b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 42923299c2f1SGregory Neil Shapiro save_errno = errno; 42933299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 4294c2aa98e2SPeter Wemm h = gethostbyname(hbuf); 42953299c2f1SGregory Neil Shapiro save_errno = errno; 42963299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 4297c2aa98e2SPeter Wemm } 4298c2aa98e2SPeter Wemm } 4299c2aa98e2SPeter Wemm } 43003299c2f1SGregory Neil Shapiro #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */ 4301c2aa98e2SPeter Wemm if (tTd(61, 10)) 4302c2aa98e2SPeter Wemm { 4303c2aa98e2SPeter Wemm if (h == NULL) 430412ed1c7cSGregory Neil Shapiro sm_dprintf("failure\n"); 4305c2aa98e2SPeter Wemm else 43063299c2f1SGregory Neil Shapiro { 430712ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", h->h_name); 43083299c2f1SGregory Neil Shapiro if (tTd(61, 11)) 43093299c2f1SGregory Neil Shapiro { 43103299c2f1SGregory Neil Shapiro #if NETINET6 43113299c2f1SGregory Neil Shapiro struct in6_addr ia6; 43123299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 43133299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 43143299c2f1SGregory Neil Shapiro struct in_addr ia; 43153299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 431612ed1c7cSGregory Neil Shapiro size_t i; 43173299c2f1SGregory Neil Shapiro 43183299c2f1SGregory Neil Shapiro if (h->h_aliases != NULL) 43193299c2f1SGregory Neil Shapiro for (i = 0; h->h_aliases[i] != NULL; 43203299c2f1SGregory Neil Shapiro i++) 432112ed1c7cSGregory Neil Shapiro sm_dprintf("\talias: %s\n", 43223299c2f1SGregory Neil Shapiro h->h_aliases[i]); 43233299c2f1SGregory Neil Shapiro for (i = 0; h->h_addr_list[i] != NULL; i++) 43243299c2f1SGregory Neil Shapiro { 43253299c2f1SGregory Neil Shapiro char *addr; 43263299c2f1SGregory Neil Shapiro 43273299c2f1SGregory Neil Shapiro #if NETINET6 43283299c2f1SGregory Neil Shapiro memmove(&ia6, h->h_addr_list[i], 43293299c2f1SGregory Neil Shapiro IN6ADDRSZ); 43303299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, 43313299c2f1SGregory Neil Shapiro buf6, sizeof buf6); 43323299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 43333299c2f1SGregory Neil Shapiro memmove(&ia, h->h_addr_list[i], 43343299c2f1SGregory Neil Shapiro INADDRSZ); 43353299c2f1SGregory Neil Shapiro addr = (char *) inet_ntoa(ia); 43363299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 43373299c2f1SGregory Neil Shapiro if (addr != NULL) 433812ed1c7cSGregory Neil Shapiro sm_dprintf("\taddr: %s\n", addr); 4339c2aa98e2SPeter Wemm } 43403299c2f1SGregory Neil Shapiro } 43413299c2f1SGregory Neil Shapiro } 43423299c2f1SGregory Neil Shapiro } 43433299c2f1SGregory Neil Shapiro errno = save_errno; 4344c2aa98e2SPeter Wemm return h; 4345c2aa98e2SPeter Wemm } 4346c2aa98e2SPeter Wemm 4347c2aa98e2SPeter Wemm struct hostent * 4348c2aa98e2SPeter Wemm sm_gethostbyaddr(addr, len, type) 4349c2aa98e2SPeter Wemm char *addr; 4350c2aa98e2SPeter Wemm int len; 4351c2aa98e2SPeter Wemm int type; 4352c2aa98e2SPeter Wemm { 43533299c2f1SGregory Neil Shapiro struct hostent *hp; 4354b4662009SGregory Neil Shapiro 4355b4662009SGregory Neil Shapiro #if NETINET6 4356b4662009SGregory Neil Shapiro if (type == AF_INET6 && 4357b4662009SGregory Neil Shapiro IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *) addr)) 4358b4662009SGregory Neil Shapiro { 4359b4662009SGregory Neil Shapiro /* Avoid reverse lookup for IPv6 unspecified address */ 4360b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(HOST_NOT_FOUND); 4361b4662009SGregory Neil Shapiro return NULL; 4362b4662009SGregory Neil Shapiro } 4363b4662009SGregory Neil Shapiro #endif /* NETINET6 */ 4364b4662009SGregory Neil Shapiro 4365c2aa98e2SPeter Wemm #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) 4366c2aa98e2SPeter Wemm # if SOLARIS == 20300 || SOLARIS == 203 4367b4662009SGregory Neil Shapiro { 43683299c2f1SGregory Neil Shapiro static struct hostent he; 4369c2aa98e2SPeter Wemm static char buf[1000]; 4370c2aa98e2SPeter Wemm extern struct hostent *_switch_gethostbyaddr_r(); 4371c2aa98e2SPeter Wemm 4372b4662009SGregory Neil Shapiro hp = _switch_gethostbyaddr_r(addr, len, type, &he, 4373b4662009SGregory Neil Shapiro buf, sizeof(buf), &h_errno); 4374b4662009SGregory Neil Shapiro } 43753299c2f1SGregory Neil Shapiro # else /* SOLARIS == 20300 || SOLARIS == 203 */ 4376b4662009SGregory Neil Shapiro { 4377c2aa98e2SPeter Wemm extern struct hostent *__switch_gethostbyaddr(); 4378c2aa98e2SPeter Wemm 43793299c2f1SGregory Neil Shapiro hp = __switch_gethostbyaddr(addr, len, type); 4380b4662009SGregory Neil Shapiro } 43813299c2f1SGregory Neil Shapiro # endif /* SOLARIS == 20300 || SOLARIS == 203 */ 43823299c2f1SGregory Neil Shapiro #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */ 43833299c2f1SGregory Neil Shapiro # if NETINET6 4384b4662009SGregory Neil Shapiro { 43853299c2f1SGregory Neil Shapiro int err; 43863299c2f1SGregory Neil Shapiro 43873299c2f1SGregory Neil Shapiro hp = getipnodebyaddr(addr, len, type, &err); 4388b4662009SGregory Neil Shapiro SM_SET_H_ERRNO(err); 4389b4662009SGregory Neil Shapiro } 43903299c2f1SGregory Neil Shapiro # else /* NETINET6 */ 43913299c2f1SGregory Neil Shapiro hp = gethostbyaddr(addr, len, type); 43923299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 43933299c2f1SGregory Neil Shapiro #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */ 4394c0c4794dSGregory Neil Shapiro return hp; 4395c2aa98e2SPeter Wemm } 439612ed1c7cSGregory Neil Shapiro /* 4397c2aa98e2SPeter Wemm ** SM_GETPW{NAM,UID} -- wrapper for getpwnam and getpwuid 4398c2aa98e2SPeter Wemm */ 4399c2aa98e2SPeter Wemm 4400c2aa98e2SPeter Wemm struct passwd * 4401c2aa98e2SPeter Wemm sm_getpwnam(user) 4402c2aa98e2SPeter Wemm char *user; 4403c2aa98e2SPeter Wemm { 4404c2aa98e2SPeter Wemm #ifdef _AIX4 4405c2aa98e2SPeter Wemm extern struct passwd *_getpwnam_shadow(const char *, const int); 4406c2aa98e2SPeter Wemm 4407c2aa98e2SPeter Wemm return _getpwnam_shadow(user, 0); 44083299c2f1SGregory Neil Shapiro #else /* _AIX4 */ 4409c2aa98e2SPeter Wemm return getpwnam(user); 44103299c2f1SGregory Neil Shapiro #endif /* _AIX4 */ 4411c2aa98e2SPeter Wemm } 4412c2aa98e2SPeter Wemm 4413c2aa98e2SPeter Wemm struct passwd * 4414c2aa98e2SPeter Wemm sm_getpwuid(uid) 4415c2aa98e2SPeter Wemm UID_T uid; 4416c2aa98e2SPeter Wemm { 4417c2aa98e2SPeter Wemm #if defined(_AIX4) && 0 4418c2aa98e2SPeter Wemm extern struct passwd *_getpwuid_shadow(const int, const int); 4419c2aa98e2SPeter Wemm 4420c2aa98e2SPeter Wemm return _getpwuid_shadow(uid,0); 44213299c2f1SGregory Neil Shapiro #else /* defined(_AIX4) && 0 */ 4422c2aa98e2SPeter Wemm return getpwuid(uid); 44233299c2f1SGregory Neil Shapiro #endif /* defined(_AIX4) && 0 */ 4424c2aa98e2SPeter Wemm } 442512ed1c7cSGregory Neil Shapiro /* 4426c2aa98e2SPeter Wemm ** SECUREWARE_SETUP_SECURE -- Convex SecureWare setup 4427c2aa98e2SPeter Wemm ** 4428c2aa98e2SPeter Wemm ** Set up the trusted computing environment for C2 level security 4429c2aa98e2SPeter Wemm ** under SecureWare. 4430c2aa98e2SPeter Wemm ** 4431c2aa98e2SPeter Wemm ** Parameters: 4432c2aa98e2SPeter Wemm ** uid -- uid of the user to initialize in the TCB 4433c2aa98e2SPeter Wemm ** 4434c2aa98e2SPeter Wemm ** Returns: 4435c2aa98e2SPeter Wemm ** none 4436c2aa98e2SPeter Wemm ** 4437c2aa98e2SPeter Wemm ** Side Effects: 4438c2aa98e2SPeter Wemm ** Initialized the user in the trusted computing base 4439c2aa98e2SPeter Wemm */ 4440c2aa98e2SPeter Wemm 4441c2aa98e2SPeter Wemm #if SECUREWARE 4442c2aa98e2SPeter Wemm 4443c2aa98e2SPeter Wemm # include <sys/security.h> 4444c2aa98e2SPeter Wemm # include <prot.h> 4445c2aa98e2SPeter Wemm 4446c2aa98e2SPeter Wemm void 4447c2aa98e2SPeter Wemm secureware_setup_secure(uid) 4448c2aa98e2SPeter Wemm UID_T uid; 4449c2aa98e2SPeter Wemm { 4450c2aa98e2SPeter Wemm int rc; 4451c2aa98e2SPeter Wemm 4452c2aa98e2SPeter Wemm if (getluid() != -1) 4453c2aa98e2SPeter Wemm return; 4454c2aa98e2SPeter Wemm 4455c2aa98e2SPeter Wemm if ((rc = set_secure_info(uid)) != SSI_GOOD_RETURN) 4456c2aa98e2SPeter Wemm { 4457c2aa98e2SPeter Wemm switch (rc) 4458c2aa98e2SPeter Wemm { 4459c2aa98e2SPeter Wemm case SSI_NO_PRPW_ENTRY: 446012ed1c7cSGregory Neil Shapiro syserr("No protected passwd entry, uid = %d", 446112ed1c7cSGregory Neil Shapiro (int) uid); 4462c2aa98e2SPeter Wemm break; 4463c2aa98e2SPeter Wemm 4464c2aa98e2SPeter Wemm case SSI_LOCKED: 446512ed1c7cSGregory Neil Shapiro syserr("Account has been disabled, uid = %d", 446612ed1c7cSGregory Neil Shapiro (int) uid); 4467c2aa98e2SPeter Wemm break; 4468c2aa98e2SPeter Wemm 4469c2aa98e2SPeter Wemm case SSI_RETIRED: 447012ed1c7cSGregory Neil Shapiro syserr("Account has been retired, uid = %d", 447112ed1c7cSGregory Neil Shapiro (int) uid); 4472c2aa98e2SPeter Wemm break; 4473c2aa98e2SPeter Wemm 4474c2aa98e2SPeter Wemm case SSI_BAD_SET_LUID: 447512ed1c7cSGregory Neil Shapiro syserr("Could not set LUID, uid = %d", (int) uid); 4476c2aa98e2SPeter Wemm break; 4477c2aa98e2SPeter Wemm 4478c2aa98e2SPeter Wemm case SSI_BAD_SET_PRIVS: 447912ed1c7cSGregory Neil Shapiro syserr("Could not set kernel privs, uid = %d", 448012ed1c7cSGregory Neil Shapiro (int) uid); 4481c2aa98e2SPeter Wemm 4482c2aa98e2SPeter Wemm default: 4483c2aa98e2SPeter Wemm syserr("Unknown return code (%d) from set_secure_info(%d)", 448412ed1c7cSGregory Neil Shapiro rc, (int) uid); 4485c2aa98e2SPeter Wemm break; 4486c2aa98e2SPeter Wemm } 448712ed1c7cSGregory Neil Shapiro finis(false, true, EX_NOPERM); 4488c2aa98e2SPeter Wemm } 4489c2aa98e2SPeter Wemm } 4490c2aa98e2SPeter Wemm #endif /* SECUREWARE */ 449112ed1c7cSGregory Neil Shapiro /* 44923299c2f1SGregory Neil Shapiro ** ADD_HOSTNAMES -- Add a hostname to class 'w' based on IP address 449376b7bf71SPeter Wemm ** 449476b7bf71SPeter Wemm ** Add hostnames to class 'w' based on the IP address read from 449576b7bf71SPeter Wemm ** the network interface. 449676b7bf71SPeter Wemm ** 449776b7bf71SPeter Wemm ** Parameters: 449876b7bf71SPeter Wemm ** sa -- a pointer to a SOCKADDR containing the address 449976b7bf71SPeter Wemm ** 450076b7bf71SPeter Wemm ** Returns: 450176b7bf71SPeter Wemm ** 0 if successful, -1 if host lookup fails. 450276b7bf71SPeter Wemm */ 450376b7bf71SPeter Wemm 45043299c2f1SGregory Neil Shapiro static int 450576b7bf71SPeter Wemm add_hostnames(sa) 450676b7bf71SPeter Wemm SOCKADDR *sa; 450776b7bf71SPeter Wemm { 450876b7bf71SPeter Wemm struct hostent *hp; 45093299c2f1SGregory Neil Shapiro char **ha; 45103299c2f1SGregory Neil Shapiro char hnb[MAXHOSTNAMELEN]; 451176b7bf71SPeter Wemm 451276b7bf71SPeter Wemm /* lookup name with IP address */ 451376b7bf71SPeter Wemm switch (sa->sa.sa_family) 451476b7bf71SPeter Wemm { 45153299c2f1SGregory Neil Shapiro #if NETINET 451676b7bf71SPeter Wemm case AF_INET: 451776b7bf71SPeter Wemm hp = sm_gethostbyaddr((char *) &sa->sin.sin_addr, 4518c46d91b7SGregory Neil Shapiro sizeof(sa->sin.sin_addr), 4519c46d91b7SGregory Neil Shapiro sa->sa.sa_family); 452076b7bf71SPeter Wemm break; 45213299c2f1SGregory Neil Shapiro #endif /* NETINET */ 45223299c2f1SGregory Neil Shapiro 45233299c2f1SGregory Neil Shapiro #if NETINET6 45243299c2f1SGregory Neil Shapiro case AF_INET6: 45253299c2f1SGregory Neil Shapiro hp = sm_gethostbyaddr((char *) &sa->sin6.sin6_addr, 4526c46d91b7SGregory Neil Shapiro sizeof(sa->sin6.sin6_addr), 4527c46d91b7SGregory Neil Shapiro sa->sa.sa_family); 45283299c2f1SGregory Neil Shapiro break; 45293299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 453076b7bf71SPeter Wemm 453176b7bf71SPeter Wemm default: 45323299c2f1SGregory Neil Shapiro /* Give warning about unsupported family */ 453376b7bf71SPeter Wemm if (LogLevel > 3) 453476b7bf71SPeter Wemm sm_syslog(LOG_WARNING, NOQID, 453576b7bf71SPeter Wemm "Unsupported address family %d: %.100s", 453676b7bf71SPeter Wemm sa->sa.sa_family, anynet_ntoa(sa)); 453776b7bf71SPeter Wemm return -1; 453876b7bf71SPeter Wemm } 453976b7bf71SPeter Wemm 454076b7bf71SPeter Wemm if (hp == NULL) 454176b7bf71SPeter Wemm { 454276b7bf71SPeter Wemm int save_errno = errno; 454376b7bf71SPeter Wemm 45443299c2f1SGregory Neil Shapiro if (LogLevel > 3 && 45453299c2f1SGregory Neil Shapiro #if NETINET6 45463299c2f1SGregory Neil Shapiro !(sa->sa.sa_family == AF_INET6 && 45473299c2f1SGregory Neil Shapiro IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr)) && 45483299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 454912ed1c7cSGregory Neil Shapiro true) 455076b7bf71SPeter Wemm sm_syslog(LOG_WARNING, NOQID, 455112ed1c7cSGregory Neil Shapiro "gethostbyaddr(%.100s) failed: %d", 455276b7bf71SPeter Wemm anynet_ntoa(sa), 455376b7bf71SPeter Wemm #if NAMED_BIND 455476b7bf71SPeter Wemm h_errno 45553299c2f1SGregory Neil Shapiro #else /* NAMED_BIND */ 455676b7bf71SPeter Wemm -1 45573299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 455876b7bf71SPeter Wemm ); 455976b7bf71SPeter Wemm errno = save_errno; 456076b7bf71SPeter Wemm return -1; 456176b7bf71SPeter Wemm } 456276b7bf71SPeter Wemm 456376b7bf71SPeter Wemm /* save its cname */ 456476b7bf71SPeter Wemm if (!wordinclass((char *) hp->h_name, 'w')) 456576b7bf71SPeter Wemm { 456676b7bf71SPeter Wemm setclass('w', (char *) hp->h_name); 456776b7bf71SPeter Wemm if (tTd(0, 4)) 456812ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", hp->h_name); 45693299c2f1SGregory Neil Shapiro 457012ed1c7cSGregory Neil Shapiro if (sm_snprintf(hnb, sizeof hnb, "[%s]", hp->h_name) < sizeof hnb 45713299c2f1SGregory Neil Shapiro && !wordinclass((char *) hnb, 'w')) 45723299c2f1SGregory Neil Shapiro setclass('w', hnb); 45733299c2f1SGregory Neil Shapiro } 45743299c2f1SGregory Neil Shapiro else 45753299c2f1SGregory Neil Shapiro { 45763299c2f1SGregory Neil Shapiro if (tTd(0, 43)) 457712ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s (already in $=w)\n", hp->h_name); 457876b7bf71SPeter Wemm } 457976b7bf71SPeter Wemm 458076b7bf71SPeter Wemm /* save all it aliases name */ 45813299c2f1SGregory Neil Shapiro for (ha = hp->h_aliases; ha != NULL && *ha != NULL; ha++) 458276b7bf71SPeter Wemm { 45833299c2f1SGregory Neil Shapiro if (!wordinclass(*ha, 'w')) 458476b7bf71SPeter Wemm { 45853299c2f1SGregory Neil Shapiro setclass('w', *ha); 458676b7bf71SPeter Wemm if (tTd(0, 4)) 458712ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", *ha); 458812ed1c7cSGregory Neil Shapiro if (sm_snprintf(hnb, sizeof hnb, 45893299c2f1SGregory Neil Shapiro "[%s]", *ha) < sizeof hnb && 45903299c2f1SGregory Neil Shapiro !wordinclass((char *) hnb, 'w')) 45913299c2f1SGregory Neil Shapiro setclass('w', hnb); 459276b7bf71SPeter Wemm } 45933299c2f1SGregory Neil Shapiro else 45943299c2f1SGregory Neil Shapiro { 45953299c2f1SGregory Neil Shapiro if (tTd(0, 43)) 459612ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s (already in $=w)\n", 45973299c2f1SGregory Neil Shapiro *ha); 45983299c2f1SGregory Neil Shapiro } 459976b7bf71SPeter Wemm } 460012ed1c7cSGregory Neil Shapiro #if NETINET6 4601c46d91b7SGregory Neil Shapiro freehostent(hp); 460212ed1c7cSGregory Neil Shapiro #endif /* NETINET6 */ 460376b7bf71SPeter Wemm return 0; 460476b7bf71SPeter Wemm } 460512ed1c7cSGregory Neil Shapiro /* 4606c2aa98e2SPeter Wemm ** LOAD_IF_NAMES -- load interface-specific names into $=w 4607c2aa98e2SPeter Wemm ** 4608c2aa98e2SPeter Wemm ** Parameters: 4609c2aa98e2SPeter Wemm ** none. 4610c2aa98e2SPeter Wemm ** 4611c2aa98e2SPeter Wemm ** Returns: 4612c2aa98e2SPeter Wemm ** none. 4613c2aa98e2SPeter Wemm ** 4614c2aa98e2SPeter Wemm ** Side Effects: 4615c2aa98e2SPeter Wemm ** Loads $=w with the names of all the interfaces. 4616c2aa98e2SPeter Wemm */ 4617c2aa98e2SPeter Wemm 46183299c2f1SGregory Neil Shapiro #if !NETINET 46193299c2f1SGregory Neil Shapiro # define SIOCGIFCONF_IS_BROKEN 1 /* XXX */ 46203299c2f1SGregory Neil Shapiro #endif /* !NETINET */ 46213299c2f1SGregory Neil Shapiro 4622c2aa98e2SPeter Wemm #if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN 4623c2aa98e2SPeter Wemm struct rtentry; 4624c2aa98e2SPeter Wemm struct mbuf; 4625c2aa98e2SPeter Wemm # ifndef SUNOS403 4626c2aa98e2SPeter Wemm # include <sys/time.h> 46273299c2f1SGregory Neil Shapiro # endif /* ! SUNOS403 */ 46283299c2f1SGregory Neil Shapiro # if (_AIX4 >= 40300) && !defined(_NET_IF_H) 4629c2aa98e2SPeter Wemm # undef __P 46303299c2f1SGregory Neil Shapiro # endif /* (_AIX4 >= 40300) && !defined(_NET_IF_H) */ 4631c2aa98e2SPeter Wemm # include <net/if.h> 46323299c2f1SGregory Neil Shapiro #endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */ 4633c2aa98e2SPeter Wemm 4634c2aa98e2SPeter Wemm void 4635c2aa98e2SPeter Wemm load_if_names() 4636c2aa98e2SPeter Wemm { 46373299c2f1SGregory Neil Shapiro # if NETINET6 && defined(SIOCGLIFCONF) 463812ed1c7cSGregory Neil Shapiro # ifdef __hpux 463912ed1c7cSGregory Neil Shapiro 464012ed1c7cSGregory Neil Shapiro /* 464112ed1c7cSGregory Neil Shapiro ** Unfortunately, HP has changed all of the structures, 464212ed1c7cSGregory Neil Shapiro ** making life difficult for implementors. 464312ed1c7cSGregory Neil Shapiro */ 464412ed1c7cSGregory Neil Shapiro 464512ed1c7cSGregory Neil Shapiro # define lifconf if_laddrconf 464612ed1c7cSGregory Neil Shapiro # define lifc_len iflc_len 464712ed1c7cSGregory Neil Shapiro # define lifc_buf iflc_buf 464812ed1c7cSGregory Neil Shapiro # define lifreq if_laddrreq 464912ed1c7cSGregory Neil Shapiro # define lifr_addr iflr_addr 465012ed1c7cSGregory Neil Shapiro # define lifr_name iflr_name 465112ed1c7cSGregory Neil Shapiro # define lifr_flags iflr_flags 465212ed1c7cSGregory Neil Shapiro # define ss_family sa_family 465312ed1c7cSGregory Neil Shapiro # undef SIOCGLIFNUM 465412ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 465512ed1c7cSGregory Neil Shapiro 46563299c2f1SGregory Neil Shapiro int s; 46573299c2f1SGregory Neil Shapiro int i; 465812ed1c7cSGregory Neil Shapiro size_t len; 46593299c2f1SGregory Neil Shapiro int numifs; 466012ed1c7cSGregory Neil Shapiro char *buf; 466112ed1c7cSGregory Neil Shapiro struct lifconf lifc; 466212ed1c7cSGregory Neil Shapiro # ifdef SIOCGLIFNUM 466312ed1c7cSGregory Neil Shapiro struct lifnum lifn; 466412ed1c7cSGregory Neil Shapiro # endif /* SIOCGLIFNUM */ 46653299c2f1SGregory Neil Shapiro 46663299c2f1SGregory Neil Shapiro s = socket(InetMode, SOCK_DGRAM, 0); 46673299c2f1SGregory Neil Shapiro if (s == -1) 46683299c2f1SGregory Neil Shapiro return; 46693299c2f1SGregory Neil Shapiro 46703299c2f1SGregory Neil Shapiro /* get the list of known IP address from the kernel */ 467112ed1c7cSGregory Neil Shapiro # ifdef __hpux 467212ed1c7cSGregory Neil Shapiro i = ioctl(s, SIOCGIFNUM, (char *) &numifs); 467312ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 46743299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFNUM 46753299c2f1SGregory Neil Shapiro lifn.lifn_family = AF_UNSPEC; 46763299c2f1SGregory Neil Shapiro lifn.lifn_flags = 0; 467712ed1c7cSGregory Neil Shapiro i = ioctl(s, SIOCGLIFNUM, (char *)&lifn); 467812ed1c7cSGregory Neil Shapiro numifs = lifn.lifn_count; 467912ed1c7cSGregory Neil Shapiro # endif /* SIOCGLIFNUM */ 468012ed1c7cSGregory Neil Shapiro 468112ed1c7cSGregory Neil Shapiro # if defined(__hpux) || defined(SIOCGLIFNUM) 468212ed1c7cSGregory Neil Shapiro if (i < 0) 46833299c2f1SGregory Neil Shapiro { 46843299c2f1SGregory Neil Shapiro /* can't get number of interfaces -- fall back */ 46853299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 468612ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFNUM failed: %s\n", 468712ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 46883299c2f1SGregory Neil Shapiro numifs = -1; 46893299c2f1SGregory Neil Shapiro } 469012ed1c7cSGregory Neil Shapiro else if (tTd(0, 42)) 469112ed1c7cSGregory Neil Shapiro sm_dprintf("system has %d interfaces\n", numifs); 46923299c2f1SGregory Neil Shapiro if (numifs < 0) 469312ed1c7cSGregory Neil Shapiro # endif /* defined(__hpux) || defined(SIOCGLIFNUM) */ 46943299c2f1SGregory Neil Shapiro numifs = MAXINTERFACES; 46953299c2f1SGregory Neil Shapiro 46963299c2f1SGregory Neil Shapiro if (numifs <= 0) 46973299c2f1SGregory Neil Shapiro { 4698c46d91b7SGregory Neil Shapiro (void) close(s); 46993299c2f1SGregory Neil Shapiro return; 47003299c2f1SGregory Neil Shapiro } 470112ed1c7cSGregory Neil Shapiro 470212ed1c7cSGregory Neil Shapiro len = lifc.lifc_len = numifs * sizeof (struct lifreq); 470312ed1c7cSGregory Neil Shapiro buf = lifc.lifc_buf = xalloc(lifc.lifc_len); 470412ed1c7cSGregory Neil Shapiro # ifndef __hpux 47053299c2f1SGregory Neil Shapiro lifc.lifc_family = AF_UNSPEC; 47063299c2f1SGregory Neil Shapiro lifc.lifc_flags = 0; 470712ed1c7cSGregory Neil Shapiro # endif /* __hpux */ 47083299c2f1SGregory Neil Shapiro if (ioctl(s, SIOCGLIFCONF, (char *)&lifc) < 0) 47093299c2f1SGregory Neil Shapiro { 47103299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 471112ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFCONF failed: %s\n", 471212ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 4713c46d91b7SGregory Neil Shapiro (void) close(s); 471412ed1c7cSGregory Neil Shapiro sm_free(buf); 47153299c2f1SGregory Neil Shapiro return; 47163299c2f1SGregory Neil Shapiro } 47173299c2f1SGregory Neil Shapiro 47183299c2f1SGregory Neil Shapiro /* scan the list of IP address */ 47193299c2f1SGregory Neil Shapiro if (tTd(0, 40)) 472012ed1c7cSGregory Neil Shapiro sm_dprintf("scanning for interface specific names, lifc_len=%ld\n", 472112ed1c7cSGregory Neil Shapiro (long) len); 47223299c2f1SGregory Neil Shapiro 472312ed1c7cSGregory Neil Shapiro for (i = 0; i < len && i >= 0; ) 47243299c2f1SGregory Neil Shapiro { 472512ed1c7cSGregory Neil Shapiro int flags; 472612ed1c7cSGregory Neil Shapiro struct lifreq *ifr = (struct lifreq *)&buf[i]; 47273299c2f1SGregory Neil Shapiro SOCKADDR *sa = (SOCKADDR *) &ifr->lifr_addr; 472812ed1c7cSGregory Neil Shapiro int af = ifr->lifr_addr.ss_family; 47293299c2f1SGregory Neil Shapiro char *addr; 473012ed1c7cSGregory Neil Shapiro char *name; 47313299c2f1SGregory Neil Shapiro struct in6_addr ia6; 47323299c2f1SGregory Neil Shapiro struct in_addr ia; 47333299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 47343299c2f1SGregory Neil Shapiro struct lifreq ifrf; 47353299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 47363299c2f1SGregory Neil Shapiro char ip_addr[256]; 47373299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 47383299c2f1SGregory Neil Shapiro 47393299c2f1SGregory Neil Shapiro /* 47403299c2f1SGregory Neil Shapiro ** We must close and recreate the socket each time 47413299c2f1SGregory Neil Shapiro ** since we don't know what type of socket it is now 47423299c2f1SGregory Neil Shapiro ** (each status function may change it). 47433299c2f1SGregory Neil Shapiro */ 47443299c2f1SGregory Neil Shapiro 47453299c2f1SGregory Neil Shapiro (void) close(s); 47463299c2f1SGregory Neil Shapiro 47473299c2f1SGregory Neil Shapiro s = socket(af, SOCK_DGRAM, 0); 47483299c2f1SGregory Neil Shapiro if (s == -1) 4749c46d91b7SGregory Neil Shapiro { 475012ed1c7cSGregory Neil Shapiro sm_free(buf); /* XXX */ 47513299c2f1SGregory Neil Shapiro return; 4752c46d91b7SGregory Neil Shapiro } 47533299c2f1SGregory Neil Shapiro 47543299c2f1SGregory Neil Shapiro /* 47553299c2f1SGregory Neil Shapiro ** If we don't have a complete ifr structure, 47563299c2f1SGregory Neil Shapiro ** don't try to use it. 47573299c2f1SGregory Neil Shapiro */ 47583299c2f1SGregory Neil Shapiro 475912ed1c7cSGregory Neil Shapiro if ((len - i) < sizeof *ifr) 47603299c2f1SGregory Neil Shapiro break; 47613299c2f1SGregory Neil Shapiro 47623299c2f1SGregory Neil Shapiro # ifdef BSD4_4_SOCKADDR 47633299c2f1SGregory Neil Shapiro if (sa->sa.sa_len > sizeof ifr->lifr_addr) 47643299c2f1SGregory Neil Shapiro i += sizeof ifr->lifr_name + sa->sa.sa_len; 47653299c2f1SGregory Neil Shapiro else 47663299c2f1SGregory Neil Shapiro # endif /* BSD4_4_SOCKADDR */ 47673299c2f1SGregory Neil Shapiro i += sizeof *ifr; 47683299c2f1SGregory Neil Shapiro 47693299c2f1SGregory Neil Shapiro if (tTd(0, 20)) 477012ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", anynet_ntoa(sa)); 47713299c2f1SGregory Neil Shapiro 47723299c2f1SGregory Neil Shapiro if (af != AF_INET && af != AF_INET6) 47733299c2f1SGregory Neil Shapiro continue; 47743299c2f1SGregory Neil Shapiro 47753299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 47763299c2f1SGregory Neil Shapiro memset(&ifrf, '\0', sizeof(struct lifreq)); 477712ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(ifrf.lifr_name, ifr->lifr_name, 47783299c2f1SGregory Neil Shapiro sizeof(ifrf.lifr_name)); 47793299c2f1SGregory Neil Shapiro if (ioctl(s, SIOCGLIFFLAGS, (char *) &ifrf) < 0) 47803299c2f1SGregory Neil Shapiro { 47813299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 478212ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGLIFFLAGS failed: %s\n", 478312ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 47843299c2f1SGregory Neil Shapiro continue; 47853299c2f1SGregory Neil Shapiro } 47863299c2f1SGregory Neil Shapiro 478712ed1c7cSGregory Neil Shapiro name = ifr->lifr_name; 478812ed1c7cSGregory Neil Shapiro flags = ifrf.lifr_flags; 478912ed1c7cSGregory Neil Shapiro 479012ed1c7cSGregory Neil Shapiro if (tTd(0, 41)) 479112ed1c7cSGregory Neil Shapiro sm_dprintf("\tflags: %lx\n", (unsigned long) flags); 479212ed1c7cSGregory Neil Shapiro 479312ed1c7cSGregory Neil Shapiro if (!bitset(IFF_UP, flags)) 47943299c2f1SGregory Neil Shapiro continue; 47953299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 47963299c2f1SGregory Neil Shapiro 47973299c2f1SGregory Neil Shapiro ip_addr[0] = '\0'; 47983299c2f1SGregory Neil Shapiro 47993299c2f1SGregory Neil Shapiro /* extract IP address from the list*/ 48003299c2f1SGregory Neil Shapiro switch (af) 48013299c2f1SGregory Neil Shapiro { 48023299c2f1SGregory Neil Shapiro case AF_INET6: 4803c46d91b7SGregory Neil Shapiro # ifdef __KAME__ 4804b4662009SGregory Neil Shapiro /* convert into proper scoped address */ 4805b4662009SGregory Neil Shapiro if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || 4806b4662009SGregory Neil Shapiro IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && 4807c46d91b7SGregory Neil Shapiro sa->sin6.sin6_scope_id == 0) 4808c46d91b7SGregory Neil Shapiro { 4809b4662009SGregory Neil Shapiro struct in6_addr *ia6p; 4810b4662009SGregory Neil Shapiro 4811b4662009SGregory Neil Shapiro ia6p = &sa->sin6.sin6_addr; 4812b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | 4813b4662009SGregory Neil Shapiro ((unsigned int)ia6p->s6_addr[2] << 8)); 4814b4662009SGregory Neil Shapiro ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; 4815c46d91b7SGregory Neil Shapiro } 4816c46d91b7SGregory Neil Shapiro # endif /* __KAME__ */ 4817b4662009SGregory Neil Shapiro ia6 = sa->sin6.sin6_addr; 4818c46d91b7SGregory Neil Shapiro if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) 48193299c2f1SGregory Neil Shapiro { 48203299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 48213299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 482212ed1c7cSGregory Neil Shapiro name, addr == NULL ? "(NULL)" : addr); 48233299c2f1SGregory Neil Shapiro continue; 48243299c2f1SGregory Neil Shapiro } 48253299c2f1SGregory Neil Shapiro 48263299c2f1SGregory Neil Shapiro /* save IP address in text from */ 48273299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 48283299c2f1SGregory Neil Shapiro if (addr != NULL) 482912ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, 48303299c2f1SGregory Neil Shapiro "[%.*s]", 483112ed1c7cSGregory Neil Shapiro (int) sizeof ip_addr - 3, 483212ed1c7cSGregory Neil Shapiro addr); 48333299c2f1SGregory Neil Shapiro break; 48343299c2f1SGregory Neil Shapiro 48353299c2f1SGregory Neil Shapiro case AF_INET: 48363299c2f1SGregory Neil Shapiro ia = sa->sin.sin_addr; 48373299c2f1SGregory Neil Shapiro if (ia.s_addr == INADDR_ANY || 48383299c2f1SGregory Neil Shapiro ia.s_addr == INADDR_NONE) 48393299c2f1SGregory Neil Shapiro { 48403299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 484112ed1c7cSGregory Neil Shapiro name, inet_ntoa(ia)); 48423299c2f1SGregory Neil Shapiro continue; 48433299c2f1SGregory Neil Shapiro } 48443299c2f1SGregory Neil Shapiro 48453299c2f1SGregory Neil Shapiro /* save IP address in text from */ 484612ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", 4847d995d2baSGregory Neil Shapiro (int) sizeof ip_addr - 3, inet_ntoa(ia)); 48483299c2f1SGregory Neil Shapiro break; 48493299c2f1SGregory Neil Shapiro } 48503299c2f1SGregory Neil Shapiro 48513299c2f1SGregory Neil Shapiro if (*ip_addr == '\0') 48523299c2f1SGregory Neil Shapiro continue; 48533299c2f1SGregory Neil Shapiro 48543299c2f1SGregory Neil Shapiro if (!wordinclass(ip_addr, 'w')) 48553299c2f1SGregory Neil Shapiro { 48563299c2f1SGregory Neil Shapiro setclass('w', ip_addr); 48573299c2f1SGregory Neil Shapiro if (tTd(0, 4)) 485812ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", ip_addr); 48593299c2f1SGregory Neil Shapiro } 48603299c2f1SGregory Neil Shapiro 48613299c2f1SGregory Neil Shapiro # ifdef SIOCGLIFFLAGS 48623299c2f1SGregory Neil Shapiro /* skip "loopback" interface "lo" */ 486312ed1c7cSGregory Neil Shapiro if (DontProbeInterfaces == DPI_SKIPLOOPBACK && 486412ed1c7cSGregory Neil Shapiro bitset(IFF_LOOPBACK, flags)) 48653299c2f1SGregory Neil Shapiro continue; 48663299c2f1SGregory Neil Shapiro # endif /* SIOCGLIFFLAGS */ 48673299c2f1SGregory Neil Shapiro (void) add_hostnames(sa); 48683299c2f1SGregory Neil Shapiro } 486912ed1c7cSGregory Neil Shapiro sm_free(buf); /* XXX */ 4870c46d91b7SGregory Neil Shapiro (void) close(s); 48713299c2f1SGregory Neil Shapiro # else /* NETINET6 && defined(SIOCGLIFCONF) */ 4872c2aa98e2SPeter Wemm # if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN 4873c2aa98e2SPeter Wemm int s; 4874c2aa98e2SPeter Wemm int i; 4875c2aa98e2SPeter Wemm struct ifconf ifc; 4876c2aa98e2SPeter Wemm int numifs; 4877c2aa98e2SPeter Wemm 4878c2aa98e2SPeter Wemm s = socket(AF_INET, SOCK_DGRAM, 0); 4879c2aa98e2SPeter Wemm if (s == -1) 4880c2aa98e2SPeter Wemm return; 4881c2aa98e2SPeter Wemm 4882c2aa98e2SPeter Wemm /* get the list of known IP address from the kernel */ 4883c2aa98e2SPeter Wemm # if defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN 4884c2aa98e2SPeter Wemm if (ioctl(s, SIOCGIFNUM, (char *) &numifs) < 0) 4885c2aa98e2SPeter Wemm { 4886c2aa98e2SPeter Wemm /* can't get number of interfaces -- fall back */ 4887c2aa98e2SPeter Wemm if (tTd(0, 4)) 488812ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGIFNUM failed: %s\n", 488912ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 4890c2aa98e2SPeter Wemm numifs = -1; 4891c2aa98e2SPeter Wemm } 4892c2aa98e2SPeter Wemm else if (tTd(0, 42)) 489312ed1c7cSGregory Neil Shapiro sm_dprintf("system has %d interfaces\n", numifs); 4894c2aa98e2SPeter Wemm if (numifs < 0) 48953299c2f1SGregory Neil Shapiro # endif /* defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN */ 48963299c2f1SGregory Neil Shapiro numifs = MAXINTERFACES; 4897c2aa98e2SPeter Wemm 4898c2aa98e2SPeter Wemm if (numifs <= 0) 4899c2aa98e2SPeter Wemm { 49003299c2f1SGregory Neil Shapiro (void) close(s); 4901c2aa98e2SPeter Wemm return; 4902c2aa98e2SPeter Wemm } 4903c2aa98e2SPeter Wemm ifc.ifc_len = numifs * sizeof (struct ifreq); 4904c2aa98e2SPeter Wemm ifc.ifc_buf = xalloc(ifc.ifc_len); 4905c2aa98e2SPeter Wemm if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) 4906c2aa98e2SPeter Wemm { 4907c2aa98e2SPeter Wemm if (tTd(0, 4)) 490812ed1c7cSGregory Neil Shapiro sm_dprintf("SIOCGIFCONF failed: %s\n", 490912ed1c7cSGregory Neil Shapiro sm_errstring(errno)); 49103299c2f1SGregory Neil Shapiro (void) close(s); 4911c2aa98e2SPeter Wemm return; 4912c2aa98e2SPeter Wemm } 4913c2aa98e2SPeter Wemm 4914c2aa98e2SPeter Wemm /* scan the list of IP address */ 4915c2aa98e2SPeter Wemm if (tTd(0, 40)) 491612ed1c7cSGregory Neil Shapiro sm_dprintf("scanning for interface specific names, ifc_len=%d\n", 4917c2aa98e2SPeter Wemm ifc.ifc_len); 4918c2aa98e2SPeter Wemm 491912ed1c7cSGregory Neil Shapiro for (i = 0; i < ifc.ifc_len && i >= 0; ) 4920c2aa98e2SPeter Wemm { 49213299c2f1SGregory Neil Shapiro int af; 4922c2aa98e2SPeter Wemm struct ifreq *ifr = (struct ifreq *) &ifc.ifc_buf[i]; 492376b7bf71SPeter Wemm SOCKADDR *sa = (SOCKADDR *) &ifr->ifr_addr; 49243299c2f1SGregory Neil Shapiro # if NETINET6 49253299c2f1SGregory Neil Shapiro char *addr; 49263299c2f1SGregory Neil Shapiro struct in6_addr ia6; 49273299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 4928c2aa98e2SPeter Wemm struct in_addr ia; 4929c2aa98e2SPeter Wemm # ifdef SIOCGIFFLAGS 4930c2aa98e2SPeter Wemm struct ifreq ifrf; 49313299c2f1SGregory Neil Shapiro # endif /* SIOCGIFFLAGS */ 4932c2aa98e2SPeter Wemm char ip_addr[256]; 49333299c2f1SGregory Neil Shapiro # if NETINET6 49343299c2f1SGregory Neil Shapiro char buf6[INET6_ADDRSTRLEN]; 49353299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 49363299c2f1SGregory Neil Shapiro 49373299c2f1SGregory Neil Shapiro /* 49383299c2f1SGregory Neil Shapiro ** If we don't have a complete ifr structure, 49393299c2f1SGregory Neil Shapiro ** don't try to use it. 49403299c2f1SGregory Neil Shapiro */ 49413299c2f1SGregory Neil Shapiro 49423299c2f1SGregory Neil Shapiro if ((ifc.ifc_len - i) < sizeof *ifr) 49433299c2f1SGregory Neil Shapiro break; 4944c2aa98e2SPeter Wemm 4945c2aa98e2SPeter Wemm # ifdef BSD4_4_SOCKADDR 494676b7bf71SPeter Wemm if (sa->sa.sa_len > sizeof ifr->ifr_addr) 494776b7bf71SPeter Wemm i += sizeof ifr->ifr_name + sa->sa.sa_len; 4948c2aa98e2SPeter Wemm else 49493299c2f1SGregory Neil Shapiro # endif /* BSD4_4_SOCKADDR */ 4950c2aa98e2SPeter Wemm i += sizeof *ifr; 4951c2aa98e2SPeter Wemm 4952c2aa98e2SPeter Wemm if (tTd(0, 20)) 495312ed1c7cSGregory Neil Shapiro sm_dprintf("%s\n", anynet_ntoa(sa)); 4954c2aa98e2SPeter Wemm 49553299c2f1SGregory Neil Shapiro af = ifr->ifr_addr.sa_family; 49563299c2f1SGregory Neil Shapiro if (af != AF_INET 49573299c2f1SGregory Neil Shapiro # if NETINET6 49583299c2f1SGregory Neil Shapiro && af != AF_INET6 49593299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 49603299c2f1SGregory Neil Shapiro ) 4961c2aa98e2SPeter Wemm continue; 4962c2aa98e2SPeter Wemm 4963c2aa98e2SPeter Wemm # ifdef SIOCGIFFLAGS 49643299c2f1SGregory Neil Shapiro memset(&ifrf, '\0', sizeof(struct ifreq)); 496512ed1c7cSGregory Neil Shapiro (void) sm_strlcpy(ifrf.ifr_name, ifr->ifr_name, 49663299c2f1SGregory Neil Shapiro sizeof(ifrf.ifr_name)); 49673299c2f1SGregory Neil Shapiro (void) ioctl(s, SIOCGIFFLAGS, (char *) &ifrf); 4968c2aa98e2SPeter Wemm if (tTd(0, 41)) 496912ed1c7cSGregory Neil Shapiro sm_dprintf("\tflags: %lx\n", 49703299c2f1SGregory Neil Shapiro (unsigned long) ifrf.ifr_flags); 4971c2aa98e2SPeter Wemm # define IFRFREF ifrf 49723299c2f1SGregory Neil Shapiro # else /* SIOCGIFFLAGS */ 4973c2aa98e2SPeter Wemm # define IFRFREF (*ifr) 49743299c2f1SGregory Neil Shapiro # endif /* SIOCGIFFLAGS */ 49753299c2f1SGregory Neil Shapiro 4976c2aa98e2SPeter Wemm if (!bitset(IFF_UP, IFRFREF.ifr_flags)) 4977c2aa98e2SPeter Wemm continue; 4978c2aa98e2SPeter Wemm 49793299c2f1SGregory Neil Shapiro ip_addr[0] = '\0'; 49803299c2f1SGregory Neil Shapiro 4981c2aa98e2SPeter Wemm /* extract IP address from the list*/ 49823299c2f1SGregory Neil Shapiro switch (af) 49833299c2f1SGregory Neil Shapiro { 49843299c2f1SGregory Neil Shapiro case AF_INET: 498576b7bf71SPeter Wemm ia = sa->sin.sin_addr; 49863299c2f1SGregory Neil Shapiro if (ia.s_addr == INADDR_ANY || 49873299c2f1SGregory Neil Shapiro ia.s_addr == INADDR_NONE) 4988c2aa98e2SPeter Wemm { 4989c2aa98e2SPeter Wemm message("WARNING: interface %s is UP with %s address", 4990c2aa98e2SPeter Wemm ifr->ifr_name, inet_ntoa(ia)); 4991c2aa98e2SPeter Wemm continue; 4992c2aa98e2SPeter Wemm } 4993c2aa98e2SPeter Wemm 4994c2aa98e2SPeter Wemm /* save IP address in text from */ 499512ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]", 49961ec86adfSBruce Evans (int) sizeof ip_addr - 3, 4997c2aa98e2SPeter Wemm inet_ntoa(ia)); 49983299c2f1SGregory Neil Shapiro break; 49993299c2f1SGregory Neil Shapiro 50003299c2f1SGregory Neil Shapiro # if NETINET6 50013299c2f1SGregory Neil Shapiro case AF_INET6: 5002b4662009SGregory Neil Shapiro # ifdef __KAME__ 5003b4662009SGregory Neil Shapiro /* convert into proper scoped address */ 5004b4662009SGregory Neil Shapiro if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) || 5005b4662009SGregory Neil Shapiro IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) && 5006b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id == 0) 5007b4662009SGregory Neil Shapiro { 5008b4662009SGregory Neil Shapiro struct in6_addr *ia6p; 5009b4662009SGregory Neil Shapiro 5010b4662009SGregory Neil Shapiro ia6p = &sa->sin6.sin6_addr; 5011b4662009SGregory Neil Shapiro sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] | 5012b4662009SGregory Neil Shapiro ((unsigned int)ia6p->s6_addr[2] << 8)); 5013b4662009SGregory Neil Shapiro ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0; 5014b4662009SGregory Neil Shapiro } 5015b4662009SGregory Neil Shapiro # endif /* __KAME__ */ 50163299c2f1SGregory Neil Shapiro ia6 = sa->sin6.sin6_addr; 5017c46d91b7SGregory Neil Shapiro if (IN6_IS_ADDR_UNSPECIFIED(&ia6)) 50183299c2f1SGregory Neil Shapiro { 50193299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 50203299c2f1SGregory Neil Shapiro message("WARNING: interface %s is UP with %s address", 50213299c2f1SGregory Neil Shapiro ifr->ifr_name, 50223299c2f1SGregory Neil Shapiro addr == NULL ? "(NULL)" : addr); 50233299c2f1SGregory Neil Shapiro continue; 50243299c2f1SGregory Neil Shapiro } 50253299c2f1SGregory Neil Shapiro 50263299c2f1SGregory Neil Shapiro /* save IP address in text from */ 50273299c2f1SGregory Neil Shapiro addr = anynet_ntop(&ia6, buf6, sizeof buf6); 50283299c2f1SGregory Neil Shapiro if (addr != NULL) 502912ed1c7cSGregory Neil Shapiro (void) sm_snprintf(ip_addr, sizeof ip_addr, 50303299c2f1SGregory Neil Shapiro "[%.*s]", 503112ed1c7cSGregory Neil Shapiro (int) sizeof ip_addr - 3, 503212ed1c7cSGregory Neil Shapiro addr); 50333299c2f1SGregory Neil Shapiro break; 50343299c2f1SGregory Neil Shapiro 50353299c2f1SGregory Neil Shapiro # endif /* NETINET6 */ 50363299c2f1SGregory Neil Shapiro } 50373299c2f1SGregory Neil Shapiro 50383299c2f1SGregory Neil Shapiro if (ip_addr[0] == '\0') 50393299c2f1SGregory Neil Shapiro continue; 50403299c2f1SGregory Neil Shapiro 5041c2aa98e2SPeter Wemm if (!wordinclass(ip_addr, 'w')) 5042c2aa98e2SPeter Wemm { 5043c2aa98e2SPeter Wemm setclass('w', ip_addr); 5044c2aa98e2SPeter Wemm if (tTd(0, 4)) 504512ed1c7cSGregory Neil Shapiro sm_dprintf("\ta.k.a.: %s\n", ip_addr); 5046c2aa98e2SPeter Wemm } 5047c2aa98e2SPeter Wemm 5048c2aa98e2SPeter Wemm /* skip "loopback" interface "lo" */ 504912ed1c7cSGregory Neil Shapiro if (DontProbeInterfaces == DPI_SKIPLOOPBACK && 505012ed1c7cSGregory Neil Shapiro bitset(IFF_LOOPBACK, IFRFREF.ifr_flags)) 5051c2aa98e2SPeter Wemm continue; 5052c2aa98e2SPeter Wemm 505376b7bf71SPeter Wemm (void) add_hostnames(sa); 5054c2aa98e2SPeter Wemm } 505512ed1c7cSGregory Neil Shapiro sm_free(ifc.ifc_buf); /* XXX */ 50563299c2f1SGregory Neil Shapiro (void) close(s); 5057c2aa98e2SPeter Wemm # undef IFRFREF 50583299c2f1SGregory Neil Shapiro # endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */ 50593299c2f1SGregory Neil Shapiro # endif /* NETINET6 && defined(SIOCGLIFCONF) */ 50603299c2f1SGregory Neil Shapiro } 506112ed1c7cSGregory Neil Shapiro /* 50623299c2f1SGregory Neil Shapiro ** ISLOOPBACK -- is socket address in the loopback net? 50633299c2f1SGregory Neil Shapiro ** 50643299c2f1SGregory Neil Shapiro ** Parameters: 50653299c2f1SGregory Neil Shapiro ** sa -- socket address. 50663299c2f1SGregory Neil Shapiro ** 50673299c2f1SGregory Neil Shapiro ** Returns: 506812ed1c7cSGregory Neil Shapiro ** true -- is socket address in the loopback net? 506912ed1c7cSGregory Neil Shapiro ** false -- otherwise 50703299c2f1SGregory Neil Shapiro ** 50713299c2f1SGregory Neil Shapiro */ 50723299c2f1SGregory Neil Shapiro 50733299c2f1SGregory Neil Shapiro bool 50743299c2f1SGregory Neil Shapiro isloopback(sa) 50753299c2f1SGregory Neil Shapiro SOCKADDR sa; 50763299c2f1SGregory Neil Shapiro { 50773299c2f1SGregory Neil Shapiro #if NETINET6 50783299c2f1SGregory Neil Shapiro if (IN6_IS_ADDR_LOOPBACK(&sa.sin6.sin6_addr)) 507912ed1c7cSGregory Neil Shapiro return true; 50803299c2f1SGregory Neil Shapiro #else /* NETINET6 */ 50813299c2f1SGregory Neil Shapiro /* XXX how to correctly extract IN_LOOPBACKNET part? */ 50823299c2f1SGregory Neil Shapiro if (((ntohl(sa.sin.sin_addr.s_addr) & IN_CLASSA_NET) 50833299c2f1SGregory Neil Shapiro >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) 508412ed1c7cSGregory Neil Shapiro return true; 50853299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 508612ed1c7cSGregory Neil Shapiro return false; 5087c2aa98e2SPeter Wemm } 508812ed1c7cSGregory Neil Shapiro /* 5089c2aa98e2SPeter Wemm ** GET_NUM_PROCS_ONLINE -- return the number of processors currently online 5090c2aa98e2SPeter Wemm ** 5091c2aa98e2SPeter Wemm ** Parameters: 5092c2aa98e2SPeter Wemm ** none. 5093c2aa98e2SPeter Wemm ** 5094c2aa98e2SPeter Wemm ** Returns: 5095c2aa98e2SPeter Wemm ** The number of processors online. 5096c2aa98e2SPeter Wemm */ 5097c2aa98e2SPeter Wemm 50983299c2f1SGregory Neil Shapiro static int 5099c2aa98e2SPeter Wemm get_num_procs_online() 5100c2aa98e2SPeter Wemm { 5101c2aa98e2SPeter Wemm int nproc = 0; 5102c2aa98e2SPeter Wemm 51033299c2f1SGregory Neil Shapiro #ifdef USESYSCTL 51043299c2f1SGregory Neil Shapiro # if defined(CTL_HW) && defined(HW_NCPU) 51053299c2f1SGregory Neil Shapiro size_t sz; 51063299c2f1SGregory Neil Shapiro int mib[2]; 51073299c2f1SGregory Neil Shapiro 51083299c2f1SGregory Neil Shapiro mib[0] = CTL_HW; 51093299c2f1SGregory Neil Shapiro mib[1] = HW_NCPU; 51103299c2f1SGregory Neil Shapiro sz = (size_t) sizeof nproc; 51113299c2f1SGregory Neil Shapiro (void) sysctl(mib, 2, &nproc, &sz, NULL, 0); 511212ed1c7cSGregory Neil Shapiro # endif /* defined(CTL_HW) && defined(HW_NCPU) */ 51133299c2f1SGregory Neil Shapiro #else /* USESYSCTL */ 5114c2aa98e2SPeter Wemm # ifdef _SC_NPROCESSORS_ONLN 5115c2aa98e2SPeter Wemm nproc = (int) sysconf(_SC_NPROCESSORS_ONLN); 51163299c2f1SGregory Neil Shapiro # else /* _SC_NPROCESSORS_ONLN */ 51173299c2f1SGregory Neil Shapiro # ifdef __hpux 51183299c2f1SGregory Neil Shapiro # include <sys/pstat.h> 51193299c2f1SGregory Neil Shapiro struct pst_dynamic psd; 51203299c2f1SGregory Neil Shapiro 51213299c2f1SGregory Neil Shapiro if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1) 51223299c2f1SGregory Neil Shapiro nproc = psd.psd_proc_cnt; 51233299c2f1SGregory Neil Shapiro # endif /* __hpux */ 51243299c2f1SGregory Neil Shapiro # endif /* _SC_NPROCESSORS_ONLN */ 51253299c2f1SGregory Neil Shapiro #endif /* USESYSCTL */ 51263299c2f1SGregory Neil Shapiro 5127c2aa98e2SPeter Wemm if (nproc <= 0) 5128c2aa98e2SPeter Wemm nproc = 1; 5129c2aa98e2SPeter Wemm return nproc; 5130c2aa98e2SPeter Wemm } 513112ed1c7cSGregory Neil Shapiro /* 51323299c2f1SGregory Neil Shapiro ** SEED_RANDOM -- seed the random number generator 51333299c2f1SGregory Neil Shapiro ** 51343299c2f1SGregory Neil Shapiro ** Parameters: 51353299c2f1SGregory Neil Shapiro ** none 51363299c2f1SGregory Neil Shapiro ** 51373299c2f1SGregory Neil Shapiro ** Returns: 51383299c2f1SGregory Neil Shapiro ** none 51393299c2f1SGregory Neil Shapiro */ 51403299c2f1SGregory Neil Shapiro 51413299c2f1SGregory Neil Shapiro void 51423299c2f1SGregory Neil Shapiro seed_random() 51433299c2f1SGregory Neil Shapiro { 51443299c2f1SGregory Neil Shapiro #if HASSRANDOMDEV 51453299c2f1SGregory Neil Shapiro srandomdev(); 51463299c2f1SGregory Neil Shapiro #else /* HASSRANDOMDEV */ 51473299c2f1SGregory Neil Shapiro long seed; 51483299c2f1SGregory Neil Shapiro struct timeval t; 51493299c2f1SGregory Neil Shapiro 515012ed1c7cSGregory Neil Shapiro seed = (long) CurrentPid; 51513299c2f1SGregory Neil Shapiro if (gettimeofday(&t, NULL) >= 0) 51523299c2f1SGregory Neil Shapiro seed += t.tv_sec + t.tv_usec; 51533299c2f1SGregory Neil Shapiro 51543299c2f1SGregory Neil Shapiro # if HASRANDOM 51553299c2f1SGregory Neil Shapiro (void) srandom(seed); 51563299c2f1SGregory Neil Shapiro # else /* HASRANDOM */ 51573299c2f1SGregory Neil Shapiro (void) srand((unsigned int) seed); 51583299c2f1SGregory Neil Shapiro # endif /* HASRANDOM */ 51593299c2f1SGregory Neil Shapiro #endif /* HASSRANDOMDEV */ 51603299c2f1SGregory Neil Shapiro } 516112ed1c7cSGregory Neil Shapiro /* 5162c2aa98e2SPeter Wemm ** SM_SYSLOG -- syslog wrapper to keep messages under SYSLOG_BUFSIZE 5163c2aa98e2SPeter Wemm ** 5164c2aa98e2SPeter Wemm ** Parameters: 5165c2aa98e2SPeter Wemm ** level -- syslog level 5166c2aa98e2SPeter Wemm ** id -- envelope ID or NULL (NOQUEUE) 5167c2aa98e2SPeter Wemm ** fmt -- format string 5168c2aa98e2SPeter Wemm ** arg... -- arguments as implied by fmt. 5169c2aa98e2SPeter Wemm ** 5170c2aa98e2SPeter Wemm ** Returns: 5171c2aa98e2SPeter Wemm ** none 5172c2aa98e2SPeter Wemm */ 5173c2aa98e2SPeter Wemm 5174c2aa98e2SPeter Wemm /* VARARGS3 */ 5175c2aa98e2SPeter Wemm void 5176c2aa98e2SPeter Wemm #ifdef __STDC__ 5177c2aa98e2SPeter Wemm sm_syslog(int level, const char *id, const char *fmt, ...) 51783299c2f1SGregory Neil Shapiro #else /* __STDC__ */ 5179c2aa98e2SPeter Wemm sm_syslog(level, id, fmt, va_alist) 5180c2aa98e2SPeter Wemm int level; 5181c2aa98e2SPeter Wemm const char *id; 5182c2aa98e2SPeter Wemm const char *fmt; 5183c2aa98e2SPeter Wemm va_dcl 51843299c2f1SGregory Neil Shapiro #endif /* __STDC__ */ 5185c2aa98e2SPeter Wemm { 5186c2aa98e2SPeter Wemm static char *buf = NULL; 51873299c2f1SGregory Neil Shapiro static size_t bufsize; 5188c2aa98e2SPeter Wemm char *begin, *end; 51893299c2f1SGregory Neil Shapiro int save_errno; 5190c2aa98e2SPeter Wemm int seq = 1; 5191c2aa98e2SPeter Wemm int idlen; 51923299c2f1SGregory Neil Shapiro char buf0[MAXLINE]; 519312ed1c7cSGregory Neil Shapiro char *newstring; 519412ed1c7cSGregory Neil Shapiro extern int SyslogPrefixLen; 519512ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 5196c2aa98e2SPeter Wemm 519712ed1c7cSGregory Neil Shapiro save_errno = errno; 5198c2aa98e2SPeter Wemm if (id == NULL) 519912ed1c7cSGregory Neil Shapiro { 5200c2aa98e2SPeter Wemm id = "NOQUEUE"; 520112ed1c7cSGregory Neil Shapiro idlen = strlen(id) + SyslogPrefixLen; 520212ed1c7cSGregory Neil Shapiro } 5203c2aa98e2SPeter Wemm else if (strcmp(id, NOQID) == 0) 520412ed1c7cSGregory Neil Shapiro { 5205c2aa98e2SPeter Wemm id = ""; 520612ed1c7cSGregory Neil Shapiro idlen = SyslogPrefixLen; 520712ed1c7cSGregory Neil Shapiro } 520812ed1c7cSGregory Neil Shapiro else 520912ed1c7cSGregory Neil Shapiro idlen = strlen(id) + SyslogPrefixLen; 5210c2aa98e2SPeter Wemm 52113299c2f1SGregory Neil Shapiro if (buf == NULL) 52123299c2f1SGregory Neil Shapiro { 52133299c2f1SGregory Neil Shapiro buf = buf0; 52143299c2f1SGregory Neil Shapiro bufsize = sizeof buf0; 52153299c2f1SGregory Neil Shapiro } 52163299c2f1SGregory Neil Shapiro 52173299c2f1SGregory Neil Shapiro for (;;) 52183299c2f1SGregory Neil Shapiro { 521912ed1c7cSGregory Neil Shapiro int n; 5220c2aa98e2SPeter Wemm 522112ed1c7cSGregory Neil Shapiro /* print log message into buf */ 522212ed1c7cSGregory Neil Shapiro SM_VA_START(ap, fmt); 522312ed1c7cSGregory Neil Shapiro n = sm_vsnprintf(buf, bufsize, fmt, ap); 522412ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 522512ed1c7cSGregory Neil Shapiro SM_ASSERT(n > 0); 522612ed1c7cSGregory Neil Shapiro if (n < bufsize) 52273299c2f1SGregory Neil Shapiro break; 52283299c2f1SGregory Neil Shapiro 5229c2aa98e2SPeter Wemm /* String too small, redo with correct size */ 523012ed1c7cSGregory Neil Shapiro bufsize = n + 1; 52313299c2f1SGregory Neil Shapiro if (buf != buf0) 523212ed1c7cSGregory Neil Shapiro { 5233c0c4794dSGregory Neil Shapiro sm_free(buf); 523412ed1c7cSGregory Neil Shapiro buf = NULL; 5235c2aa98e2SPeter Wemm } 523612ed1c7cSGregory Neil Shapiro buf = sm_malloc_x(bufsize); 523712ed1c7cSGregory Neil Shapiro } 523812ed1c7cSGregory Neil Shapiro 523912ed1c7cSGregory Neil Shapiro /* clean up buf after it has been expanded with args */ 524012ed1c7cSGregory Neil Shapiro newstring = str2prt(buf); 524112ed1c7cSGregory Neil Shapiro if ((strlen(newstring) + idlen + 1) < SYSLOG_BUFSIZE) 5242c2aa98e2SPeter Wemm { 5243c2aa98e2SPeter Wemm #if LOG 5244c2aa98e2SPeter Wemm if (*id == '\0') 524512ed1c7cSGregory Neil Shapiro syslog(level, "%s", newstring); 5246c2aa98e2SPeter Wemm else 524712ed1c7cSGregory Neil Shapiro syslog(level, "%s: %s", id, newstring); 52483299c2f1SGregory Neil Shapiro #else /* LOG */ 5249c2aa98e2SPeter Wemm /*XXX should do something more sensible */ 5250c2aa98e2SPeter Wemm if (*id == '\0') 525112ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s\n", 525212ed1c7cSGregory Neil Shapiro newstring); 5253c2aa98e2SPeter Wemm else 525412ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 525512ed1c7cSGregory Neil Shapiro "%s: %s\n", id, newstring); 52563299c2f1SGregory Neil Shapiro #endif /* LOG */ 52573299c2f1SGregory Neil Shapiro if (buf == buf0) 52583299c2f1SGregory Neil Shapiro buf = NULL; 52593299c2f1SGregory Neil Shapiro errno = save_errno; 5260c2aa98e2SPeter Wemm return; 5261c2aa98e2SPeter Wemm } 5262c2aa98e2SPeter Wemm 526312ed1c7cSGregory Neil Shapiro /* 526412ed1c7cSGregory Neil Shapiro ** additional length for splitting: " ..." + 3, where 3 is magic to 526512ed1c7cSGregory Neil Shapiro ** have some data for the next entry. 526612ed1c7cSGregory Neil Shapiro */ 526712ed1c7cSGregory Neil Shapiro 526812ed1c7cSGregory Neil Shapiro #define SL_SPLIT 7 526912ed1c7cSGregory Neil Shapiro 527012ed1c7cSGregory Neil Shapiro begin = newstring; 527112ed1c7cSGregory Neil Shapiro idlen += 5; /* strlen("[999]"), see below */ 5272c2aa98e2SPeter Wemm while (*begin != '\0' && 527312ed1c7cSGregory Neil Shapiro (strlen(begin) + idlen) > SYSLOG_BUFSIZE) 5274c2aa98e2SPeter Wemm { 5275c2aa98e2SPeter Wemm char save; 5276c2aa98e2SPeter Wemm 527712ed1c7cSGregory Neil Shapiro if (seq >= 999) 5278c2aa98e2SPeter Wemm { 5279c2aa98e2SPeter Wemm /* Too many messages */ 5280c2aa98e2SPeter Wemm break; 5281c2aa98e2SPeter Wemm } 528212ed1c7cSGregory Neil Shapiro end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT; 5283c2aa98e2SPeter Wemm while (end > begin) 5284c2aa98e2SPeter Wemm { 5285c2aa98e2SPeter Wemm /* Break on comma or space */ 5286c2aa98e2SPeter Wemm if (*end == ',' || *end == ' ') 5287c2aa98e2SPeter Wemm { 5288c2aa98e2SPeter Wemm end++; /* Include separator */ 5289c2aa98e2SPeter Wemm break; 5290c2aa98e2SPeter Wemm } 5291c2aa98e2SPeter Wemm end--; 5292c2aa98e2SPeter Wemm } 5293c2aa98e2SPeter Wemm /* No separator, break midstring... */ 5294c2aa98e2SPeter Wemm if (end == begin) 529512ed1c7cSGregory Neil Shapiro end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT; 5296c2aa98e2SPeter Wemm save = *end; 5297c2aa98e2SPeter Wemm *end = 0; 5298c2aa98e2SPeter Wemm #if LOG 5299c2aa98e2SPeter Wemm syslog(level, "%s[%d]: %s ...", id, seq++, begin); 53003299c2f1SGregory Neil Shapiro #else /* LOG */ 530112ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 530212ed1c7cSGregory Neil Shapiro "%s[%d]: %s ...\n", id, seq++, begin); 53033299c2f1SGregory Neil Shapiro #endif /* LOG */ 5304c2aa98e2SPeter Wemm *end = save; 5305c2aa98e2SPeter Wemm begin = end; 5306c2aa98e2SPeter Wemm } 530712ed1c7cSGregory Neil Shapiro if (seq >= 999) 5308c2aa98e2SPeter Wemm #if LOG 53093299c2f1SGregory Neil Shapiro syslog(level, "%s[%d]: log terminated, too many parts", 53103299c2f1SGregory Neil Shapiro id, seq); 53113299c2f1SGregory Neil Shapiro #else /* LOG */ 531212ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 531312ed1c7cSGregory Neil Shapiro "%s[%d]: log terminated, too many parts\n", id, seq); 53143299c2f1SGregory Neil Shapiro #endif /* LOG */ 5315c2aa98e2SPeter Wemm else if (*begin != '\0') 5316c2aa98e2SPeter Wemm #if LOG 5317c2aa98e2SPeter Wemm syslog(level, "%s[%d]: %s", id, seq, begin); 53183299c2f1SGregory Neil Shapiro #else /* LOG */ 531912ed1c7cSGregory Neil Shapiro (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, 532012ed1c7cSGregory Neil Shapiro "%s[%d]: %s\n", id, seq, begin); 53213299c2f1SGregory Neil Shapiro #endif /* LOG */ 53223299c2f1SGregory Neil Shapiro if (buf == buf0) 53233299c2f1SGregory Neil Shapiro buf = NULL; 53243299c2f1SGregory Neil Shapiro errno = save_errno; 5325c2aa98e2SPeter Wemm } 532612ed1c7cSGregory Neil Shapiro /* 5327c2aa98e2SPeter Wemm ** HARD_SYSLOG -- call syslog repeatedly until it works 5328c2aa98e2SPeter Wemm ** 5329c2aa98e2SPeter Wemm ** Needed on HP-UX, which apparently doesn't guarantee that 5330c2aa98e2SPeter Wemm ** syslog succeeds during interrupt handlers. 5331c2aa98e2SPeter Wemm */ 5332c2aa98e2SPeter Wemm 5333c2aa98e2SPeter Wemm #if defined(__hpux) && !defined(HPUX11) 5334c2aa98e2SPeter Wemm 5335c2aa98e2SPeter Wemm # define MAXSYSLOGTRIES 100 5336c2aa98e2SPeter Wemm # undef syslog 5337c2aa98e2SPeter Wemm # ifdef V4FS 5338c2aa98e2SPeter Wemm # define XCNST const 5339c2aa98e2SPeter Wemm # define CAST (const char *) 53403299c2f1SGregory Neil Shapiro # else /* V4FS */ 5341c2aa98e2SPeter Wemm # define XCNST 5342c2aa98e2SPeter Wemm # define CAST 53433299c2f1SGregory Neil Shapiro # endif /* V4FS */ 5344c2aa98e2SPeter Wemm 5345c2aa98e2SPeter Wemm void 5346c2aa98e2SPeter Wemm # ifdef __STDC__ 5347c2aa98e2SPeter Wemm hard_syslog(int pri, XCNST char *msg, ...) 53483299c2f1SGregory Neil Shapiro # else /* __STDC__ */ 5349c2aa98e2SPeter Wemm hard_syslog(pri, msg, va_alist) 5350c2aa98e2SPeter Wemm int pri; 5351c2aa98e2SPeter Wemm XCNST char *msg; 5352c2aa98e2SPeter Wemm va_dcl 53533299c2f1SGregory Neil Shapiro # endif /* __STDC__ */ 5354c2aa98e2SPeter Wemm { 5355c2aa98e2SPeter Wemm int i; 5356c2aa98e2SPeter Wemm char buf[SYSLOG_BUFSIZE]; 535712ed1c7cSGregory Neil Shapiro SM_VA_LOCAL_DECL 5358c2aa98e2SPeter Wemm 535912ed1c7cSGregory Neil Shapiro SM_VA_START(ap, msg); 536012ed1c7cSGregory Neil Shapiro (void) sm_vsnprintf(buf, sizeof buf, msg, ap); 536112ed1c7cSGregory Neil Shapiro SM_VA_END(ap); 5362c2aa98e2SPeter Wemm 5363c2aa98e2SPeter Wemm for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; ) 5364c2aa98e2SPeter Wemm continue; 5365c2aa98e2SPeter Wemm } 5366c2aa98e2SPeter Wemm 5367c2aa98e2SPeter Wemm # undef CAST 53683299c2f1SGregory Neil Shapiro #endif /* defined(__hpux) && !defined(HPUX11) */ 53693299c2f1SGregory Neil Shapiro #if NEEDLOCAL_HOSTNAME_LENGTH 537012ed1c7cSGregory Neil Shapiro /* 5371c2aa98e2SPeter Wemm ** LOCAL_HOSTNAME_LENGTH 5372c2aa98e2SPeter Wemm ** 5373c2aa98e2SPeter Wemm ** This is required to get sendmail to compile against BIND 4.9.x 5374c2aa98e2SPeter Wemm ** on Ultrix. 53753299c2f1SGregory Neil Shapiro ** 53763299c2f1SGregory Neil Shapiro ** Unfortunately, a Compaq Y2K patch kit provides it without 53773299c2f1SGregory Neil Shapiro ** bumping __RES in /usr/include/resolv.h so we can't automatically 53783299c2f1SGregory Neil Shapiro ** figure out whether it is needed. 5379c2aa98e2SPeter Wemm */ 5380c2aa98e2SPeter Wemm 5381c2aa98e2SPeter Wemm int 5382c2aa98e2SPeter Wemm local_hostname_length(hostname) 5383c2aa98e2SPeter Wemm char *hostname; 5384c2aa98e2SPeter Wemm { 538512ed1c7cSGregory Neil Shapiro size_t len_host, len_domain; 5386c2aa98e2SPeter Wemm 5387c2aa98e2SPeter Wemm if (!*_res.defdname) 5388c2aa98e2SPeter Wemm res_init(); 5389c2aa98e2SPeter Wemm len_host = strlen(hostname); 5390c2aa98e2SPeter Wemm len_domain = strlen(_res.defdname); 5391c2aa98e2SPeter Wemm if (len_host > len_domain && 539212ed1c7cSGregory Neil Shapiro (sm_strcasecmp(hostname + len_host - len_domain, 53933299c2f1SGregory Neil Shapiro _res.defdname) == 0) && 5394c2aa98e2SPeter Wemm hostname[len_host - len_domain - 1] == '.') 5395c2aa98e2SPeter Wemm return len_host - len_domain - 1; 5396c2aa98e2SPeter Wemm else 5397c2aa98e2SPeter Wemm return 0; 5398c2aa98e2SPeter Wemm } 53993299c2f1SGregory Neil Shapiro #endif /* NEEDLOCAL_HOSTNAME_LENGTH */ 5400c2aa98e2SPeter Wemm 540112ed1c7cSGregory Neil Shapiro #if NEEDLINK 540212ed1c7cSGregory Neil Shapiro /* 540312ed1c7cSGregory Neil Shapiro ** LINK -- clone a file 540412ed1c7cSGregory Neil Shapiro ** 540512ed1c7cSGregory Neil Shapiro ** Some OS's lacks link() and hard links. Since sendmail is using 540612ed1c7cSGregory Neil Shapiro ** link() as an efficient way to clone files, this implementation 540712ed1c7cSGregory Neil Shapiro ** will simply do a file copy. 540812ed1c7cSGregory Neil Shapiro ** 540912ed1c7cSGregory Neil Shapiro ** NOTE: This link() replacement is not a generic replacement as it 541012ed1c7cSGregory Neil Shapiro ** does not handle all of the semantics of the real link(2). 541112ed1c7cSGregory Neil Shapiro ** 541212ed1c7cSGregory Neil Shapiro ** Parameters: 541312ed1c7cSGregory Neil Shapiro ** source -- pathname of existing file. 541412ed1c7cSGregory Neil Shapiro ** target -- pathname of link (clone) to be created. 541512ed1c7cSGregory Neil Shapiro ** 541612ed1c7cSGregory Neil Shapiro ** Returns: 541712ed1c7cSGregory Neil Shapiro ** 0 -- success. 541812ed1c7cSGregory Neil Shapiro ** -1 -- failure, see errno for details. 541912ed1c7cSGregory Neil Shapiro */ 542012ed1c7cSGregory Neil Shapiro 542112ed1c7cSGregory Neil Shapiro int 542212ed1c7cSGregory Neil Shapiro link(source, target) 542312ed1c7cSGregory Neil Shapiro const char *source; 542412ed1c7cSGregory Neil Shapiro const char *target; 542512ed1c7cSGregory Neil Shapiro { 542612ed1c7cSGregory Neil Shapiro int save_errno; 542712ed1c7cSGregory Neil Shapiro int sff; 542812ed1c7cSGregory Neil Shapiro int src = -1, dst = -1; 542912ed1c7cSGregory Neil Shapiro ssize_t readlen; 543012ed1c7cSGregory Neil Shapiro ssize_t writelen; 543112ed1c7cSGregory Neil Shapiro char buf[BUFSIZ]; 543212ed1c7cSGregory Neil Shapiro struct stat st; 543312ed1c7cSGregory Neil Shapiro 543412ed1c7cSGregory Neil Shapiro sff = SFF_REGONLY|SFF_OPENASROOT; 543512ed1c7cSGregory Neil Shapiro if (DontLockReadFiles) 543612ed1c7cSGregory Neil Shapiro sff |= SFF_NOLOCK; 543712ed1c7cSGregory Neil Shapiro 543812ed1c7cSGregory Neil Shapiro /* Open the original file */ 543912ed1c7cSGregory Neil Shapiro src = safeopen((char *)source, O_RDONLY, 0, sff); 544012ed1c7cSGregory Neil Shapiro if (src < 0) 544112ed1c7cSGregory Neil Shapiro goto fail; 544212ed1c7cSGregory Neil Shapiro 544312ed1c7cSGregory Neil Shapiro /* Obtain the size and the mode */ 544412ed1c7cSGregory Neil Shapiro if (fstat(src, &st) < 0) 544512ed1c7cSGregory Neil Shapiro goto fail; 544612ed1c7cSGregory Neil Shapiro 544712ed1c7cSGregory Neil Shapiro /* Create the duplicate copy */ 544812ed1c7cSGregory Neil Shapiro sff &= ~SFF_NOLOCK; 544912ed1c7cSGregory Neil Shapiro sff |= SFF_CREAT; 545012ed1c7cSGregory Neil Shapiro dst = safeopen((char *)target, O_CREAT|O_EXCL|O_WRONLY, 545112ed1c7cSGregory Neil Shapiro st.st_mode, sff); 545212ed1c7cSGregory Neil Shapiro if (dst < 0) 545312ed1c7cSGregory Neil Shapiro goto fail; 545412ed1c7cSGregory Neil Shapiro 545512ed1c7cSGregory Neil Shapiro /* Copy all of the bytes one buffer at a time */ 545612ed1c7cSGregory Neil Shapiro while ((readlen = read(src, &buf, sizeof(buf))) > 0) 545712ed1c7cSGregory Neil Shapiro { 545812ed1c7cSGregory Neil Shapiro ssize_t left = readlen; 545912ed1c7cSGregory Neil Shapiro char *p = buf; 546012ed1c7cSGregory Neil Shapiro 546112ed1c7cSGregory Neil Shapiro while (left > 0 && 546212ed1c7cSGregory Neil Shapiro (writelen = write(dst, p, (size_t) left)) >= 0) 546312ed1c7cSGregory Neil Shapiro { 546412ed1c7cSGregory Neil Shapiro left -= writelen; 546512ed1c7cSGregory Neil Shapiro p += writelen; 546612ed1c7cSGregory Neil Shapiro } 5467320f00e7SGregory Neil Shapiro if (writelen < 0) 546812ed1c7cSGregory Neil Shapiro break; 546912ed1c7cSGregory Neil Shapiro } 547012ed1c7cSGregory Neil Shapiro 547112ed1c7cSGregory Neil Shapiro /* Any trouble reading? */ 547212ed1c7cSGregory Neil Shapiro if (readlen < 0 || writelen < 0) 547312ed1c7cSGregory Neil Shapiro goto fail; 547412ed1c7cSGregory Neil Shapiro 547512ed1c7cSGregory Neil Shapiro /* Close the input file */ 547612ed1c7cSGregory Neil Shapiro if (close(src) < 0) 547712ed1c7cSGregory Neil Shapiro { 547812ed1c7cSGregory Neil Shapiro src = -1; 547912ed1c7cSGregory Neil Shapiro goto fail; 548012ed1c7cSGregory Neil Shapiro } 548112ed1c7cSGregory Neil Shapiro src = -1; 548212ed1c7cSGregory Neil Shapiro 548312ed1c7cSGregory Neil Shapiro /* Close the output file */ 548412ed1c7cSGregory Neil Shapiro if (close(dst) < 0) 548512ed1c7cSGregory Neil Shapiro { 548612ed1c7cSGregory Neil Shapiro /* don't set dst = -1 here so we unlink the file */ 548712ed1c7cSGregory Neil Shapiro goto fail; 548812ed1c7cSGregory Neil Shapiro } 548912ed1c7cSGregory Neil Shapiro 549012ed1c7cSGregory Neil Shapiro /* Success */ 549112ed1c7cSGregory Neil Shapiro return 0; 549212ed1c7cSGregory Neil Shapiro 549312ed1c7cSGregory Neil Shapiro fail: 549412ed1c7cSGregory Neil Shapiro save_errno = errno; 549512ed1c7cSGregory Neil Shapiro if (src >= 0) 549612ed1c7cSGregory Neil Shapiro (void) close(src); 549712ed1c7cSGregory Neil Shapiro if (dst >= 0) 549812ed1c7cSGregory Neil Shapiro { 549912ed1c7cSGregory Neil Shapiro (void) unlink(target); 550012ed1c7cSGregory Neil Shapiro (void) close(dst); 550112ed1c7cSGregory Neil Shapiro } 550212ed1c7cSGregory Neil Shapiro errno = save_errno; 550312ed1c7cSGregory Neil Shapiro return -1; 550412ed1c7cSGregory Neil Shapiro } 550512ed1c7cSGregory Neil Shapiro #endif /* NEEDLINK */ 550612ed1c7cSGregory Neil Shapiro 550712ed1c7cSGregory Neil Shapiro /* 5508c2aa98e2SPeter Wemm ** Compile-Time options 5509c2aa98e2SPeter Wemm */ 5510c2aa98e2SPeter Wemm 5511c2aa98e2SPeter Wemm char *CompileOptions[] = 5512c2aa98e2SPeter Wemm { 551312ed1c7cSGregory Neil Shapiro #if NAMED_BIND 551412ed1c7cSGregory Neil Shapiro # if DNSMAP 551512ed1c7cSGregory Neil Shapiro "DNSMAP", 551612ed1c7cSGregory Neil Shapiro # endif /* DNSMAP */ 551712ed1c7cSGregory Neil Shapiro #endif /* NAMED_BIND */ 5518c0c4794dSGregory Neil Shapiro #if EGD 5519c0c4794dSGregory Neil Shapiro "EGD", 5520c0c4794dSGregory Neil Shapiro #endif /* EGD */ 552112ed1c7cSGregory Neil Shapiro #if HESIOD 5522c2aa98e2SPeter Wemm "HESIOD", 55233299c2f1SGregory Neil Shapiro #endif /* HESIOD */ 5524c2aa98e2SPeter Wemm #if HES_GETMAILHOST 5525c2aa98e2SPeter Wemm "HES_GETMAILHOST", 55263299c2f1SGregory Neil Shapiro #endif /* HES_GETMAILHOST */ 552712ed1c7cSGregory Neil Shapiro #if LDAPMAP 5528c2aa98e2SPeter Wemm "LDAPMAP", 55293299c2f1SGregory Neil Shapiro #endif /* LDAPMAP */ 5530c2aa98e2SPeter Wemm #if LOG 5531c2aa98e2SPeter Wemm "LOG", 55323299c2f1SGregory Neil Shapiro #endif /* LOG */ 553312ed1c7cSGregory Neil Shapiro #if MAP_NSD 553412ed1c7cSGregory Neil Shapiro "MAP_NSD", 553512ed1c7cSGregory Neil Shapiro #endif /* MAP_NSD */ 553612ed1c7cSGregory Neil Shapiro #if MAP_REGEX 553712ed1c7cSGregory Neil Shapiro "MAP_REGEX", 553812ed1c7cSGregory Neil Shapiro #endif /* MAP_REGEX */ 5539c2aa98e2SPeter Wemm #if MATCHGECOS 5540c2aa98e2SPeter Wemm "MATCHGECOS", 55413299c2f1SGregory Neil Shapiro #endif /* MATCHGECOS */ 554212ed1c7cSGregory Neil Shapiro #if MILTER 554312ed1c7cSGregory Neil Shapiro "MILTER", 554412ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 5545c2aa98e2SPeter Wemm #if MIME7TO8 5546c2aa98e2SPeter Wemm "MIME7TO8", 55473299c2f1SGregory Neil Shapiro #endif /* MIME7TO8 */ 5548c2aa98e2SPeter Wemm #if MIME8TO7 5549c2aa98e2SPeter Wemm "MIME8TO7", 55503299c2f1SGregory Neil Shapiro #endif /* MIME8TO7 */ 5551c2aa98e2SPeter Wemm #if NAMED_BIND 5552c2aa98e2SPeter Wemm "NAMED_BIND", 55533299c2f1SGregory Neil Shapiro #endif /* NAMED_BIND */ 555412ed1c7cSGregory Neil Shapiro #if NDBM 5555c2aa98e2SPeter Wemm "NDBM", 55563299c2f1SGregory Neil Shapiro #endif /* NDBM */ 5557c2aa98e2SPeter Wemm #if NETINET 5558c2aa98e2SPeter Wemm "NETINET", 55593299c2f1SGregory Neil Shapiro #endif /* NETINET */ 55603299c2f1SGregory Neil Shapiro #if NETINET6 55613299c2f1SGregory Neil Shapiro "NETINET6", 55623299c2f1SGregory Neil Shapiro #endif /* NETINET6 */ 5563c2aa98e2SPeter Wemm #if NETINFO 5564c2aa98e2SPeter Wemm "NETINFO", 55653299c2f1SGregory Neil Shapiro #endif /* NETINFO */ 5566c2aa98e2SPeter Wemm #if NETISO 5567c2aa98e2SPeter Wemm "NETISO", 55683299c2f1SGregory Neil Shapiro #endif /* NETISO */ 5569c2aa98e2SPeter Wemm #if NETNS 5570c2aa98e2SPeter Wemm "NETNS", 55713299c2f1SGregory Neil Shapiro #endif /* NETNS */ 5572c2aa98e2SPeter Wemm #if NETUNIX 5573c2aa98e2SPeter Wemm "NETUNIX", 55743299c2f1SGregory Neil Shapiro #endif /* NETUNIX */ 5575c2aa98e2SPeter Wemm #if NETX25 5576c2aa98e2SPeter Wemm "NETX25", 55773299c2f1SGregory Neil Shapiro #endif /* NETX25 */ 557812ed1c7cSGregory Neil Shapiro #if NEWDB 5579c2aa98e2SPeter Wemm "NEWDB", 55803299c2f1SGregory Neil Shapiro #endif /* NEWDB */ 558112ed1c7cSGregory Neil Shapiro #if NIS 5582c2aa98e2SPeter Wemm "NIS", 55833299c2f1SGregory Neil Shapiro #endif /* NIS */ 558412ed1c7cSGregory Neil Shapiro #if NISPLUS 5585c2aa98e2SPeter Wemm "NISPLUS", 55863299c2f1SGregory Neil Shapiro #endif /* NISPLUS */ 558712ed1c7cSGregory Neil Shapiro #if NO_DH 558812ed1c7cSGregory Neil Shapiro "NO_DH", 558912ed1c7cSGregory Neil Shapiro #endif /* NO_DH */ 559012ed1c7cSGregory Neil Shapiro #if PH_MAP 55913299c2f1SGregory Neil Shapiro "PH_MAP", 55923299c2f1SGregory Neil Shapiro #endif /* PH_MAP */ 559312ed1c7cSGregory Neil Shapiro #ifdef PICKY_HELO_CHECK 559412ed1c7cSGregory Neil Shapiro "PICKY_HELO_CHECK", 559512ed1c7cSGregory Neil Shapiro #endif /* PICKY_HELO_CHECK */ 559612ed1c7cSGregory Neil Shapiro #if PIPELINING 559712ed1c7cSGregory Neil Shapiro "PIPELINING", 559812ed1c7cSGregory Neil Shapiro #endif /* PIPELINING */ 55993299c2f1SGregory Neil Shapiro #if SASL 560088ad41d4SGregory Neil Shapiro # if SASL >= 20000 560188ad41d4SGregory Neil Shapiro "SASLv2", 560288ad41d4SGregory Neil Shapiro # else /* SASL >= 20000 */ 56033299c2f1SGregory Neil Shapiro "SASL", 560488ad41d4SGregory Neil Shapiro # endif /* SASL >= 20000 */ 56053299c2f1SGregory Neil Shapiro #endif /* SASL */ 5606c2aa98e2SPeter Wemm #if SCANF 5607c2aa98e2SPeter Wemm "SCANF", 56083299c2f1SGregory Neil Shapiro #endif /* SCANF */ 5609c2aa98e2SPeter Wemm #if SMTPDEBUG 5610c2aa98e2SPeter Wemm "SMTPDEBUG", 56113299c2f1SGregory Neil Shapiro #endif /* SMTPDEBUG */ 56123299c2f1SGregory Neil Shapiro #if STARTTLS 56133299c2f1SGregory Neil Shapiro "STARTTLS", 56143299c2f1SGregory Neil Shapiro #endif /* STARTTLS */ 561512ed1c7cSGregory Neil Shapiro #if SUID_ROOT_FILES_OK 5616c2aa98e2SPeter Wemm "SUID_ROOT_FILES_OK", 56173299c2f1SGregory Neil Shapiro #endif /* SUID_ROOT_FILES_OK */ 5618c2aa98e2SPeter Wemm #if TCPWRAPPERS 5619c2aa98e2SPeter Wemm "TCPWRAPPERS", 56203299c2f1SGregory Neil Shapiro #endif /* TCPWRAPPERS */ 562112ed1c7cSGregory Neil Shapiro #if TLS_NO_RSA 562212ed1c7cSGregory Neil Shapiro "TLS_NO_RSA", 562312ed1c7cSGregory Neil Shapiro #endif /* TLS_NO_RSA */ 562412ed1c7cSGregory Neil Shapiro #if TLS_VRFY_PER_CTX 562512ed1c7cSGregory Neil Shapiro "TLS_VRFY_PER_CTX", 562612ed1c7cSGregory Neil Shapiro #endif /* TLS_VRFY_PER_CTX */ 5627c2aa98e2SPeter Wemm #if USERDB 5628c2aa98e2SPeter Wemm "USERDB", 56293299c2f1SGregory Neil Shapiro #endif /* USERDB */ 5630320f00e7SGregory Neil Shapiro #if USE_LDAP_INIT 5631320f00e7SGregory Neil Shapiro "USE_LDAP_INIT", 5632320f00e7SGregory Neil Shapiro #endif /* USE_LDAP_INIT */ 5633c2aa98e2SPeter Wemm #if XDEBUG 5634c2aa98e2SPeter Wemm "XDEBUG", 56353299c2f1SGregory Neil Shapiro #endif /* XDEBUG */ 563612ed1c7cSGregory Neil Shapiro #if XLA 5637c2aa98e2SPeter Wemm "XLA", 56383299c2f1SGregory Neil Shapiro #endif /* XLA */ 5639c2aa98e2SPeter Wemm NULL 5640c2aa98e2SPeter Wemm }; 5641c2aa98e2SPeter Wemm 5642c2aa98e2SPeter Wemm 5643c2aa98e2SPeter Wemm /* 5644c2aa98e2SPeter Wemm ** OS compile options. 5645c2aa98e2SPeter Wemm */ 5646c2aa98e2SPeter Wemm 5647c2aa98e2SPeter Wemm char *OsCompileOptions[] = 5648c2aa98e2SPeter Wemm { 564912ed1c7cSGregory Neil Shapiro #if ADDRCONFIG_IS_BROKEN 565012ed1c7cSGregory Neil Shapiro "ADDRCONFIG_IS_BROKEN", 565112ed1c7cSGregory Neil Shapiro #endif /* ADDRCONFIG_IS_BROKEN */ 565212ed1c7cSGregory Neil Shapiro #ifdef AUTO_NETINFO_HOSTS 565312ed1c7cSGregory Neil Shapiro "AUTO_NETINFO_HOSTS", 565412ed1c7cSGregory Neil Shapiro #endif /* AUTO_NETINFO_HOSTS */ 565512ed1c7cSGregory Neil Shapiro #ifdef AUTO_NIS_ALIASES 565612ed1c7cSGregory Neil Shapiro "AUTO_NIS_ALIASES", 565712ed1c7cSGregory Neil Shapiro #endif /* AUTO_NIS_ALIASES */ 565812ed1c7cSGregory Neil Shapiro #if BROKEN_RES_SEARCH 565912ed1c7cSGregory Neil Shapiro "BROKEN_RES_SEARCH", 566012ed1c7cSGregory Neil Shapiro #endif /* BROKEN_RES_SEARCH */ 566112ed1c7cSGregory Neil Shapiro #ifdef BSD4_4_SOCKADDR 566212ed1c7cSGregory Neil Shapiro "BSD4_4_SOCKADDR", 566312ed1c7cSGregory Neil Shapiro #endif /* BSD4_4_SOCKADDR */ 5664c2aa98e2SPeter Wemm #if BOGUS_O_EXCL 5665c2aa98e2SPeter Wemm "BOGUS_O_EXCL", 56663299c2f1SGregory Neil Shapiro #endif /* BOGUS_O_EXCL */ 566712ed1c7cSGregory Neil Shapiro #if DEC_OSF_BROKEN_GETPWENT 566812ed1c7cSGregory Neil Shapiro "DEC_OSF_BROKEN_GETPWENT", 566912ed1c7cSGregory Neil Shapiro #endif /* DEC_OSF_BROKEN_GETPWENT */ 56703299c2f1SGregory Neil Shapiro #if FAST_PID_RECYCLE 56713299c2f1SGregory Neil Shapiro "FAST_PID_RECYCLE", 56723299c2f1SGregory Neil Shapiro #endif /* FAST_PID_RECYCLE */ 56733299c2f1SGregory Neil Shapiro #if HASFCHOWN 56743299c2f1SGregory Neil Shapiro "HASFCHOWN", 56753299c2f1SGregory Neil Shapiro #endif /* HASFCHOWN */ 5676c2aa98e2SPeter Wemm #if HASFCHMOD 5677c2aa98e2SPeter Wemm "HASFCHMOD", 56783299c2f1SGregory Neil Shapiro #endif /* HASFCHMOD */ 5679c2aa98e2SPeter Wemm #if HASFLOCK 5680c2aa98e2SPeter Wemm "HASFLOCK", 56813299c2f1SGregory Neil Shapiro #endif /* HASFLOCK */ 5682c2aa98e2SPeter Wemm #if HASGETDTABLESIZE 5683c2aa98e2SPeter Wemm "HASGETDTABLESIZE", 56843299c2f1SGregory Neil Shapiro #endif /* HASGETDTABLESIZE */ 5685c2aa98e2SPeter Wemm #if HASGETUSERSHELL 5686c2aa98e2SPeter Wemm "HASGETUSERSHELL", 56873299c2f1SGregory Neil Shapiro #endif /* HASGETUSERSHELL */ 5688c2aa98e2SPeter Wemm #if HASINITGROUPS 5689c2aa98e2SPeter Wemm "HASINITGROUPS", 56903299c2f1SGregory Neil Shapiro #endif /* HASINITGROUPS */ 5691c2aa98e2SPeter Wemm #if HASLSTAT 5692c2aa98e2SPeter Wemm "HASLSTAT", 56933299c2f1SGregory Neil Shapiro #endif /* HASLSTAT */ 569412ed1c7cSGregory Neil Shapiro #if HASNICE 569512ed1c7cSGregory Neil Shapiro "HASNICE", 569612ed1c7cSGregory Neil Shapiro #endif /* HASNICE */ 56973299c2f1SGregory Neil Shapiro #if HASRANDOM 56983299c2f1SGregory Neil Shapiro "HASRANDOM", 56993299c2f1SGregory Neil Shapiro #endif /* HASRANDOM */ 570012ed1c7cSGregory Neil Shapiro #if HASRRESVPORT 570112ed1c7cSGregory Neil Shapiro "HASRRESVPORT", 570212ed1c7cSGregory Neil Shapiro #endif /* HASRRESVPORT */ 570312ed1c7cSGregory Neil Shapiro #if HASSETEGID 570412ed1c7cSGregory Neil Shapiro "HASSETEGID", 570512ed1c7cSGregory Neil Shapiro #endif /* HASSETEGID */ 57063299c2f1SGregory Neil Shapiro #if HASSETLOGIN 57073299c2f1SGregory Neil Shapiro "HASSETLOGIN", 57083299c2f1SGregory Neil Shapiro #endif /* HASSETLOGIN */ 570912ed1c7cSGregory Neil Shapiro #if HASSETREGID 571012ed1c7cSGregory Neil Shapiro "HASSETREGID", 571112ed1c7cSGregory Neil Shapiro #endif /* HASSETREGID */ 571212ed1c7cSGregory Neil Shapiro #if HASSETRESGID 571312ed1c7cSGregory Neil Shapiro "HASSETRESGID", 571412ed1c7cSGregory Neil Shapiro #endif /* HASSETRESGID */ 5715c2aa98e2SPeter Wemm #if HASSETREUID 5716c2aa98e2SPeter Wemm "HASSETREUID", 57173299c2f1SGregory Neil Shapiro #endif /* HASSETREUID */ 5718c2aa98e2SPeter Wemm #if HASSETRLIMIT 5719c2aa98e2SPeter Wemm "HASSETRLIMIT", 57203299c2f1SGregory Neil Shapiro #endif /* HASSETRLIMIT */ 5721c2aa98e2SPeter Wemm #if HASSETSID 5722c2aa98e2SPeter Wemm "HASSETSID", 57233299c2f1SGregory Neil Shapiro #endif /* HASSETSID */ 5724c2aa98e2SPeter Wemm #if HASSETUSERCONTEXT 5725c2aa98e2SPeter Wemm "HASSETUSERCONTEXT", 57263299c2f1SGregory Neil Shapiro #endif /* HASSETUSERCONTEXT */ 5727c2aa98e2SPeter Wemm #if HASSETVBUF 5728c2aa98e2SPeter Wemm "HASSETVBUF", 57293299c2f1SGregory Neil Shapiro #endif /* HASSETVBUF */ 5730c2aa98e2SPeter Wemm #if HAS_ST_GEN 5731c2aa98e2SPeter Wemm "HAS_ST_GEN", 57323299c2f1SGregory Neil Shapiro #endif /* HAS_ST_GEN */ 57333299c2f1SGregory Neil Shapiro #if HASSRANDOMDEV 57343299c2f1SGregory Neil Shapiro "HASSRANDOMDEV", 57353299c2f1SGregory Neil Shapiro #endif /* HASSRANDOMDEV */ 57363299c2f1SGregory Neil Shapiro #if HASURANDOMDEV 57373299c2f1SGregory Neil Shapiro "HASURANDOMDEV", 57383299c2f1SGregory Neil Shapiro #endif /* HASURANDOMDEV */ 5739c2aa98e2SPeter Wemm #if HASSTRERROR 5740c2aa98e2SPeter Wemm "HASSTRERROR", 57413299c2f1SGregory Neil Shapiro #endif /* HASSTRERROR */ 5742c2aa98e2SPeter Wemm #if HASULIMIT 5743c2aa98e2SPeter Wemm "HASULIMIT", 57443299c2f1SGregory Neil Shapiro #endif /* HASULIMIT */ 5745c2aa98e2SPeter Wemm #if HASUNAME 5746c2aa98e2SPeter Wemm "HASUNAME", 57473299c2f1SGregory Neil Shapiro #endif /* HASUNAME */ 5748c2aa98e2SPeter Wemm #if HASUNSETENV 5749c2aa98e2SPeter Wemm "HASUNSETENV", 57503299c2f1SGregory Neil Shapiro #endif /* HASUNSETENV */ 5751c2aa98e2SPeter Wemm #if HASWAITPID 5752c2aa98e2SPeter Wemm "HASWAITPID", 57533299c2f1SGregory Neil Shapiro #endif /* HASWAITPID */ 5754c2aa98e2SPeter Wemm #if IDENTPROTO 5755c2aa98e2SPeter Wemm "IDENTPROTO", 57563299c2f1SGregory Neil Shapiro #endif /* IDENTPROTO */ 5757c2aa98e2SPeter Wemm #if IP_SRCROUTE 5758c2aa98e2SPeter Wemm "IP_SRCROUTE", 57593299c2f1SGregory Neil Shapiro #endif /* IP_SRCROUTE */ 5760c2aa98e2SPeter Wemm #if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL 5761c2aa98e2SPeter Wemm "LOCK_ON_OPEN", 57623299c2f1SGregory Neil Shapiro #endif /* O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL */ 5763c2aa98e2SPeter Wemm #if NEEDFSYNC 5764c2aa98e2SPeter Wemm "NEEDFSYNC", 57653299c2f1SGregory Neil Shapiro #endif /* NEEDFSYNC */ 576612ed1c7cSGregory Neil Shapiro #if NEEDLINK 576712ed1c7cSGregory Neil Shapiro "NEEDLINK", 576812ed1c7cSGregory Neil Shapiro #endif /* NEEDLINK */ 576912ed1c7cSGregory Neil Shapiro #if NEEDLOCAL_HOSTNAME_LENGTH 577012ed1c7cSGregory Neil Shapiro "NEEDLOCAL_HOSTNAME_LENGTH", 577112ed1c7cSGregory Neil Shapiro #endif /* NEEDLOCAL_HOSTNAME_LENGTH */ 577212ed1c7cSGregory Neil Shapiro #if NEEDSGETIPNODE 577312ed1c7cSGregory Neil Shapiro "NEEDSGETIPNODE", 577412ed1c7cSGregory Neil Shapiro #endif /* NEEDSGETIPNODE */ 577512ed1c7cSGregory Neil Shapiro #if NEEDSTRSTR 577612ed1c7cSGregory Neil Shapiro "NEEDSTRSTR", 577712ed1c7cSGregory Neil Shapiro #endif /* NEEDSTRSTR */ 577812ed1c7cSGregory Neil Shapiro #if NEEDSTRTOL 577912ed1c7cSGregory Neil Shapiro "NEEDSTRTOL", 578012ed1c7cSGregory Neil Shapiro #endif /* NEEDSTRTOL */ 578112ed1c7cSGregory Neil Shapiro #ifdef NO_GETSERVBYNAME 578212ed1c7cSGregory Neil Shapiro "NO_GETSERVBYNAME", 578312ed1c7cSGregory Neil Shapiro #endif /* NO_GETSERVBYNAME */ 5784c2aa98e2SPeter Wemm #if NOFTRUNCATE 5785c2aa98e2SPeter Wemm "NOFTRUNCATE", 57863299c2f1SGregory Neil Shapiro #endif /* NOFTRUNCATE */ 578712ed1c7cSGregory Neil Shapiro #if REQUIRES_DIR_FSYNC 578812ed1c7cSGregory Neil Shapiro "REQUIRES_DIR_FSYNC", 578912ed1c7cSGregory Neil Shapiro #endif /* REQUIRES_DIR_FSYNC */ 5790c2aa98e2SPeter Wemm #if RLIMIT_NEEDS_SYS_TIME_H 5791c2aa98e2SPeter Wemm "RLIMIT_NEEDS_SYS_TIME_H", 57923299c2f1SGregory Neil Shapiro #endif /* RLIMIT_NEEDS_SYS_TIME_H */ 5793c2aa98e2SPeter Wemm #if SAFENFSPATHCONF 5794c2aa98e2SPeter Wemm "SAFENFSPATHCONF", 57953299c2f1SGregory Neil Shapiro #endif /* SAFENFSPATHCONF */ 5796c2aa98e2SPeter Wemm #if SECUREWARE 5797c2aa98e2SPeter Wemm "SECUREWARE", 57983299c2f1SGregory Neil Shapiro #endif /* SECUREWARE */ 5799c2aa98e2SPeter Wemm #if SHARE_V1 5800c2aa98e2SPeter Wemm "SHARE_V1", 58013299c2f1SGregory Neil Shapiro #endif /* SHARE_V1 */ 5802c2aa98e2SPeter Wemm #if SIOCGIFCONF_IS_BROKEN 5803c2aa98e2SPeter Wemm "SIOCGIFCONF_IS_BROKEN", 58043299c2f1SGregory Neil Shapiro #endif /* SIOCGIFCONF_IS_BROKEN */ 5805c2aa98e2SPeter Wemm #if SIOCGIFNUM_IS_BROKEN 5806c2aa98e2SPeter Wemm "SIOCGIFNUM_IS_BROKEN", 58073299c2f1SGregory Neil Shapiro #endif /* SIOCGIFNUM_IS_BROKEN */ 58083299c2f1SGregory Neil Shapiro #if SNPRINTF_IS_BROKEN 58093299c2f1SGregory Neil Shapiro "SNPRINTF_IS_BROKEN", 58103299c2f1SGregory Neil Shapiro #endif /* SNPRINTF_IS_BROKEN */ 58113299c2f1SGregory Neil Shapiro #if SO_REUSEADDR_IS_BROKEN 58123299c2f1SGregory Neil Shapiro "SO_REUSEADDR_IS_BROKEN", 58133299c2f1SGregory Neil Shapiro #endif /* SO_REUSEADDR_IS_BROKEN */ 5814c2aa98e2SPeter Wemm #if SYS5SETPGRP 5815c2aa98e2SPeter Wemm "SYS5SETPGRP", 58163299c2f1SGregory Neil Shapiro #endif /* SYS5SETPGRP */ 5817c2aa98e2SPeter Wemm #if SYSTEM5 5818c2aa98e2SPeter Wemm "SYSTEM5", 58193299c2f1SGregory Neil Shapiro #endif /* SYSTEM5 */ 582012ed1c7cSGregory Neil Shapiro #if USE_DOUBLE_FORK 582112ed1c7cSGregory Neil Shapiro "USE_DOUBLE_FORK", 582212ed1c7cSGregory Neil Shapiro #endif /* USE_DOUBLE_FORK */ 582312ed1c7cSGregory Neil Shapiro #if USE_ENVIRON 582412ed1c7cSGregory Neil Shapiro "USE_ENVIRON", 582512ed1c7cSGregory Neil Shapiro #endif /* USE_ENVIRON */ 5826c2aa98e2SPeter Wemm #if USE_SA_SIGACTION 5827c2aa98e2SPeter Wemm "USE_SA_SIGACTION", 58283299c2f1SGregory Neil Shapiro #endif /* USE_SA_SIGACTION */ 5829c2aa98e2SPeter Wemm #if USE_SIGLONGJMP 5830c2aa98e2SPeter Wemm "USE_SIGLONGJMP", 58313299c2f1SGregory Neil Shapiro #endif /* USE_SIGLONGJMP */ 583212ed1c7cSGregory Neil Shapiro #if USEGETCONFATTR 583312ed1c7cSGregory Neil Shapiro "USEGETCONFATTR", 583412ed1c7cSGregory Neil Shapiro #endif /* USEGETCONFATTR */ 5835c2aa98e2SPeter Wemm #if USESETEUID 5836c2aa98e2SPeter Wemm "USESETEUID", 58373299c2f1SGregory Neil Shapiro #endif /* USESETEUID */ 583812ed1c7cSGregory Neil Shapiro #ifdef USESYSCTL 583912ed1c7cSGregory Neil Shapiro "USESYSCTL", 584012ed1c7cSGregory Neil Shapiro #endif /* USESYSCTL */ 584112ed1c7cSGregory Neil Shapiro #if USING_NETSCAPE_LDAP 584212ed1c7cSGregory Neil Shapiro "USING_NETSCAPE_LDAP", 584312ed1c7cSGregory Neil Shapiro #endif /* USING_NETSCAPE_LDAP */ 584412ed1c7cSGregory Neil Shapiro #ifdef WAITUNION 584512ed1c7cSGregory Neil Shapiro "WAITUNION", 584612ed1c7cSGregory Neil Shapiro #endif /* WAITUNION */ 584712ed1c7cSGregory Neil Shapiro NULL 584812ed1c7cSGregory Neil Shapiro }; 584912ed1c7cSGregory Neil Shapiro 585012ed1c7cSGregory Neil Shapiro /* 585112ed1c7cSGregory Neil Shapiro ** FFR compile options. 585212ed1c7cSGregory Neil Shapiro */ 585312ed1c7cSGregory Neil Shapiro 585412ed1c7cSGregory Neil Shapiro char *FFRCompileOptions[] = 585512ed1c7cSGregory Neil Shapiro { 585612ed1c7cSGregory Neil Shapiro #if _FFR_ADAPTIVE_EOL 585712ed1c7cSGregory Neil Shapiro "_FFR_ADAPTIVE_EOL", 585812ed1c7cSGregory Neil Shapiro #endif /* _FFR_ADAPTIVE_EOL */ 585912ed1c7cSGregory Neil Shapiro #if _FFR_ALLOW_SASLINFO 586012ed1c7cSGregory Neil Shapiro "_FFR_ALLOW_SASLINFO", 586112ed1c7cSGregory Neil Shapiro #endif /* _FFR_ALLOW_SASLINFO */ 5862320f00e7SGregory Neil Shapiro #if _FFR_ALLOW_S0_ERROR_4XX 5863320f00e7SGregory Neil Shapiro "_FFR_ALLOW_S0_ERROR_4XX", 5864320f00e7SGregory Neil Shapiro #endif /* _FFR_ALLOW_S0_ERROR_4XX */ 586512ed1c7cSGregory Neil Shapiro #if _FFR_BESTMX_BETTER_TRUNCATION 586612ed1c7cSGregory Neil Shapiro "_FFR_BESTMX_BETTER_TRUNCATION", 586712ed1c7cSGregory Neil Shapiro #endif /* _FFR_BESTMX_BETTER_TRUNCATION */ 586812ed1c7cSGregory Neil Shapiro #if _FFR_CACHE_LPC 586912ed1c7cSGregory Neil Shapiro /* Christophe Wolfhugel of France Telecom Oleane */ 587012ed1c7cSGregory Neil Shapiro "_FFR_CACHE_LPC", 587112ed1c7cSGregory Neil Shapiro #endif /* _FFR_CACHE_LPC */ 587212ed1c7cSGregory Neil Shapiro #if _FFR_CATCH_BROKEN_MTAS 587312ed1c7cSGregory Neil Shapiro "_FFR_CATCH_BROKEN_MTAS", 587412ed1c7cSGregory Neil Shapiro #endif /* _FFR_CATCH_BROKEN_MTAS */ 5875320f00e7SGregory Neil Shapiro #if _FFR_CATCH_LONG_STRINGS 5876320f00e7SGregory Neil Shapiro "_FFR_CATCH_LONG_STRINGS", 5877320f00e7SGregory Neil Shapiro #endif /* _FFR_CATCH_LONG_STRINGS */ 587812ed1c7cSGregory Neil Shapiro #if _FFR_CHECK_EOM 587912ed1c7cSGregory Neil Shapiro "_FFR_CHECK_EOM", 588012ed1c7cSGregory Neil Shapiro #endif /* _FFR_CHECK_EOM */ 588188ad41d4SGregory Neil Shapiro #if _FFR_CHK_QUEUE 588288ad41d4SGregory Neil Shapiro "_FFR_CHK_QUEUE", 588388ad41d4SGregory Neil Shapiro #endif /* _FFR_CHK_QUEUE */ 588412ed1c7cSGregory Neil Shapiro #if _FFR_CONTROL_MSTAT 588512ed1c7cSGregory Neil Shapiro "_FFR_CONTROL_MSTAT", 588612ed1c7cSGregory Neil Shapiro #endif /* _FFR_CONTROL_MSTAT */ 588712ed1c7cSGregory Neil Shapiro #if _FFR_DAEMON_NETUNIX 588812ed1c7cSGregory Neil Shapiro "_FFR_DAEMON_NETUNIX", 588912ed1c7cSGregory Neil Shapiro #endif /* _FFR_DAEMON_NETUNIX */ 589012ed1c7cSGregory Neil Shapiro #if _FFR_DEPRECATE_MAILER_FLAG_I 589112ed1c7cSGregory Neil Shapiro "_FFR_DEPRECATE_MAILER_FLAG_I", 589212ed1c7cSGregory Neil Shapiro #endif /* _FFR_DEPRECATE_MAILER_FLAG_I */ 5893320f00e7SGregory Neil Shapiro #if _FFR_DIGUNIX_SAFECHOWN 5894320f00e7SGregory Neil Shapiro /* Problem noted by Anne Bennett of Concordia University */ 5895320f00e7SGregory Neil Shapiro "_FFR_DIGUNIX_SAFECHOWN", 5896320f00e7SGregory Neil Shapiro #endif /* _FFR_DIGUNIX_SAFECHOWN */ 5897320f00e7SGregory Neil Shapiro #if _FFR_DNSMAP_ALIASABLE 5898320f00e7SGregory Neil Shapiro /* Don Lewis of TDK */ 5899320f00e7SGregory Neil Shapiro "_FFR_DNSMAP_ALIASABLE", 5900320f00e7SGregory Neil Shapiro #endif /* _FFR_DNSMAP_ALIASABLE */ 590112ed1c7cSGregory Neil Shapiro #if _FFR_DNSMAP_BASE 590212ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_BASE", 590312ed1c7cSGregory Neil Shapiro #endif /* _FFR_DNSMAP_BASE */ 590412ed1c7cSGregory Neil Shapiro #if _FFR_DNSMAP_MULTI 590512ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_MULTI", 590612ed1c7cSGregory Neil Shapiro # if _FFR_DNSMAP_MULTILIMIT 590712ed1c7cSGregory Neil Shapiro "_FFR_DNSMAP_MULTILIMIT", 590812ed1c7cSGregory Neil Shapiro # endif /* _FFR_DNSMAP_MULTILIMIT */ 590912ed1c7cSGregory Neil Shapiro #endif /* _FFR_DNSMAP_MULTI */ 591012ed1c7cSGregory Neil Shapiro #if _FFR_DONTLOCKFILESFORREAD_OPTION 591112ed1c7cSGregory Neil Shapiro "_FFR_DONTLOCKFILESFORREAD_OPTION", 591212ed1c7cSGregory Neil Shapiro #endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */ 5913320f00e7SGregory Neil Shapiro # if _FFR_DONT_STOP_LOOKING 5914320f00e7SGregory Neil Shapiro /* Noted by Neil Rickert of Northern Illinois University */ 5915320f00e7SGregory Neil Shapiro "_FFR_DONT_STOP_LOOKING", 5916320f00e7SGregory Neil Shapiro # endif /* _FFR_DONT_STOP_LOOKING */ 591712ed1c7cSGregory Neil Shapiro #if _FFR_DOTTED_USERNAMES 591812ed1c7cSGregory Neil Shapiro "_FFR_DOTTED_USERNAMES", 591912ed1c7cSGregory Neil Shapiro #endif /* _FFR_DOTTED_USERNAMES */ 592012ed1c7cSGregory Neil Shapiro #if _FFR_DROP_TRUSTUSER_WARNING 592112ed1c7cSGregory Neil Shapiro "_FFR_DROP_TRUSTUSER_WARNING", 592212ed1c7cSGregory Neil Shapiro #endif /* _FFR_DROP_TRUSTUSER_WARNING */ 592312ed1c7cSGregory Neil Shapiro #if _FFR_FIX_DASHT 592412ed1c7cSGregory Neil Shapiro "_FFR_FIX_DASHT", 592512ed1c7cSGregory Neil Shapiro #endif /* _FFR_FIX_DASHT */ 592612ed1c7cSGregory Neil Shapiro #if _FFR_FORWARD_SYSERR 592712ed1c7cSGregory Neil Shapiro "_FFR_FORWARD_SYSERR", 592812ed1c7cSGregory Neil Shapiro #endif /* _FFR_FORWARD_SYSERR */ 592912ed1c7cSGregory Neil Shapiro #if _FFR_GEN_ORCPT 593012ed1c7cSGregory Neil Shapiro "_FFR_GEN_ORCPT", 593112ed1c7cSGregory Neil Shapiro #endif /* _FFR_GEN_ORCPT */ 593212ed1c7cSGregory Neil Shapiro #if _FFR_GROUPREADABLEAUTHINFOFILE 593312ed1c7cSGregory Neil Shapiro "_FFR_GROUPREADABLEAUTHINFOFILE", 593412ed1c7cSGregory Neil Shapiro #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */ 5935320f00e7SGregory Neil Shapiro #if _FFR_HANDLE_ISO8859_GECOS 5936320f00e7SGregory Neil Shapiro /* Peter Eriksson of Linkopings universitet */ 5937320f00e7SGregory Neil Shapiro "_FFR_HANDLE_ISO8859_GECOS", 5938320f00e7SGregory Neil Shapiro #endif /* _FFR_HANDLE_ISO8859_GECOS */ 593912ed1c7cSGregory Neil Shapiro #if _FFR_HDR_TYPE 594012ed1c7cSGregory Neil Shapiro "_FFR_HDR_TYPE", 594112ed1c7cSGregory Neil Shapiro #endif /* _FFR_HDR_TYPE */ 594212ed1c7cSGregory Neil Shapiro #if _FFR_HPUX_NSSWITCH 594312ed1c7cSGregory Neil Shapiro "_FFR_HPUX_NSSWITCH", 594412ed1c7cSGregory Neil Shapiro #endif /* _FFR_HPUX_NSSWITCH */ 594512ed1c7cSGregory Neil Shapiro #if _FFR_IGNORE_EXT_ON_HELO 594612ed1c7cSGregory Neil Shapiro "_FFR_IGNORE_EXT_ON_HELO", 594712ed1c7cSGregory Neil Shapiro #endif /* _FFR_IGNORE_EXT_ON_HELO */ 594812ed1c7cSGregory Neil Shapiro #if _FFR_LDAP_RECURSION 5949320f00e7SGregory Neil Shapiro /* Andrew Baucom */ 595012ed1c7cSGregory Neil Shapiro "_FFR_LDAP_RECURSION", 595112ed1c7cSGregory Neil Shapiro #endif /* _FFR_LDAP_RECURSION */ 5952320f00e7SGregory Neil Shapiro #if _FFR_LDAP_SETVERSION 5953320f00e7SGregory Neil Shapiro "_FFR_LDAP_SETVERSION", 5954320f00e7SGregory Neil Shapiro #endif /* _FFR_LDAP_SETVERSION */ 5955320f00e7SGregory Neil Shapiro #if _FFR_LDAP_URI 5956320f00e7SGregory Neil Shapiro "_FFR_LDAP_URI", 5957320f00e7SGregory Neil Shapiro #endif /* _FFR_LDAP_URI */ 595812ed1c7cSGregory Neil Shapiro #if _FFR_MAX_FORWARD_ENTRIES 595912ed1c7cSGregory Neil Shapiro /* Randall S. Winchester of the University of Maryland */ 596012ed1c7cSGregory Neil Shapiro "_FFR_MAX_FORWARD_ENTRIES", 596112ed1c7cSGregory Neil Shapiro #endif /* _FFR_MAX_FORWARD_ENTRIES */ 596212ed1c7cSGregory Neil Shapiro #if MILTER 596312ed1c7cSGregory Neil Shapiro # if _FFR_MILTER_PERDAEMON 596412ed1c7cSGregory Neil Shapiro "_FFR_MILTER_PERDAEMON", 596512ed1c7cSGregory Neil Shapiro # endif /* _FFR_MILTER_PERDAEMON */ 596612ed1c7cSGregory Neil Shapiro #endif /* MILTER */ 596712ed1c7cSGregory Neil Shapiro #if _FFR_NODELAYDSN_ON_HOLD 596812ed1c7cSGregory Neil Shapiro /* Steven Pitzl */ 596912ed1c7cSGregory Neil Shapiro "_FFR_NODELAYDSN_ON_HOLD", 597012ed1c7cSGregory Neil Shapiro #endif /* _FFR_NODELAYDSN_ON_HOLD */ 59719d8fddc1SGregory Neil Shapiro #if _FFR_NONSTOP_PERSISTENCE 59729d8fddc1SGregory Neil Shapiro /* Suggested by Jan Krueger of digitalanswers communications consulting gmbh. */ 59739d8fddc1SGregory Neil Shapiro "_FFR_NONSTOP_PERSISTENCE", 59749d8fddc1SGregory Neil Shapiro #endif /* _FFR_NONSTOP_PERSISTENCE */ 597512ed1c7cSGregory Neil Shapiro #if _FFR_NO_PIPE 597612ed1c7cSGregory Neil Shapiro "_FFR_NO_PIPE", 597712ed1c7cSGregory Neil Shapiro #endif /* _FFR_NO_PIPE */ 597812ed1c7cSGregory Neil Shapiro #if _FFR_QUARANTINE 597912ed1c7cSGregory Neil Shapiro "_FFR_QUARANTINE", 598012ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUARANTINE */ 598112ed1c7cSGregory Neil Shapiro #if _FFR_QUEUEDELAY 598212ed1c7cSGregory Neil Shapiro "_FFR_QUEUEDELAY", 598312ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUEDELAY */ 5984320f00e7SGregory Neil Shapiro #if _FFR_QUEUE_GROUP_SORTORDER 5985320f00e7SGregory Neil Shapiro /* XXX: Still need to actually use qgrp->qg_sortorder */ 5986320f00e7SGregory Neil Shapiro "_FFR_QUEUE_GROUP_SORTORDER", 5987320f00e7SGregory Neil Shapiro #endif /* _FFR_QUEUE_GROUP_SORTORDER */ 598812ed1c7cSGregory Neil Shapiro #if _FFR_QUEUE_MACRO 598912ed1c7cSGregory Neil Shapiro "_FFR_QUEUE_MACRO", 599012ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUE_MACRO */ 5991320f00e7SGregory Neil Shapiro #if _FFR_QUEUE_RUN_PARANOIA 5992320f00e7SGregory Neil Shapiro "_FFR_QUEUE_RUN_PARANOIA", 5993320f00e7SGregory Neil Shapiro #endif /* _FFR_QUEUE_RUN_PARANOIA */ 599412ed1c7cSGregory Neil Shapiro #if _FFR_QUEUE_SCHED_DBG 599512ed1c7cSGregory Neil Shapiro "_FFR_QUEUE_SCHED_DBG", 599612ed1c7cSGregory Neil Shapiro #endif /* _FFR_QUEUE_SCHED_DBG */ 599712ed1c7cSGregory Neil Shapiro #if _FFR_REDIRECTEMPTY 599812ed1c7cSGregory Neil Shapiro "_FFR_REDIRECTEMPTY", 599912ed1c7cSGregory Neil Shapiro #endif /* _FFR_REDIRECTEMPTY */ 600012ed1c7cSGregory Neil Shapiro #if _FFR_RESET_MACRO_GLOBALS 600112ed1c7cSGregory Neil Shapiro "_FFR_RESET_MACRO_GLOBALS", 600212ed1c7cSGregory Neil Shapiro #endif /* _FFR_RESET_MACRO_GLOBALS */ 600388ad41d4SGregory Neil Shapiro #if _FFR_RESPOND_ALL 600488ad41d4SGregory Neil Shapiro /* in vacation */ 600588ad41d4SGregory Neil Shapiro "_FFR_RESPOND_ALL", 600688ad41d4SGregory Neil Shapiro #endif /* _FFR_RESPOND_ALL */ 600712ed1c7cSGregory Neil Shapiro #if _FFR_RHS 600812ed1c7cSGregory Neil Shapiro "_FFR_RHS", 600912ed1c7cSGregory Neil Shapiro #endif /* _FFR_RHS */ 601088ad41d4SGregory Neil Shapiro #if _FFR_SASL_OPT_M 601188ad41d4SGregory Neil Shapiro "_FFR_SASL_OPT_M", 601288ad41d4SGregory Neil Shapiro #endif /* _FFR_SASL_OPT_M */ 6013320f00e7SGregory Neil Shapiro #if _FFR_SELECT_SHM 6014320f00e7SGregory Neil Shapiro "_FFR_SELECT_SHM", 6015320f00e7SGregory Neil Shapiro #endif /* _FFR_SELECT_SHM */ 601612ed1c7cSGregory Neil Shapiro #if _FFR_SHM_STATUS 601712ed1c7cSGregory Neil Shapiro "_FFR_SHM_STATUS", 601812ed1c7cSGregory Neil Shapiro #endif /* _FFR_SHM_STATUS */ 601988ad41d4SGregory Neil Shapiro #if _FFR_SMFI_OPENSOCKET 602088ad41d4SGregory Neil Shapiro "_FFR_SMFI_OPENSOCKET", 602188ad41d4SGregory Neil Shapiro #endif /* _FFR_SMFI_OPENSOCKET */ 602212ed1c7cSGregory Neil Shapiro #if _FFR_SMTP_SSL 602312ed1c7cSGregory Neil Shapiro "_FFR_SMTP_SSL", 602412ed1c7cSGregory Neil Shapiro #endif /* _FFR_SMTP_SSL */ 602512ed1c7cSGregory Neil Shapiro #if _FFR_SOFT_BOUNCE 602612ed1c7cSGregory Neil Shapiro "_FFR_SOFT_BOUNCE", 602712ed1c7cSGregory Neil Shapiro #endif /* _FFR_SOFT_BOUNCE */ 602888ad41d4SGregory Neil Shapiro #if _FFR_SPT_ALIGN 602988ad41d4SGregory Neil Shapiro /* Chris Adams of HiWAAY Informations Services */ 603088ad41d4SGregory Neil Shapiro "_FFR_SPT_ALIGN", 603188ad41d4SGregory Neil Shapiro #endif /* _FFR_SPT_ALIGN */ 603212ed1c7cSGregory Neil Shapiro #if _FFR_TIMERS 603312ed1c7cSGregory Neil Shapiro "_FFR_TIMERS", 603412ed1c7cSGregory Neil Shapiro #endif /* _FFR_TIMERS */ 603512ed1c7cSGregory Neil Shapiro #if _FFR_TLS_1 603612ed1c7cSGregory Neil Shapiro "_FFR_TLS_1", 603712ed1c7cSGregory Neil Shapiro #endif /* _FFR_TLS_1 */ 603812ed1c7cSGregory Neil Shapiro #if _FFR_TRUSTED_QF 603912ed1c7cSGregory Neil Shapiro "_FFR_TRUSTED_QF", 604012ed1c7cSGregory Neil Shapiro #endif /* _FFR_TRUSTED_QF */ 6041320f00e7SGregory Neil Shapiro #if _FFR_USE_SETLOGIN 6042320f00e7SGregory Neil Shapiro /* Peter Philipp */ 6043320f00e7SGregory Neil Shapiro "_FFR_USE_SETLOGIN", 6044320f00e7SGregory Neil Shapiro #endif /* _FFR_USE_SETLOGIN */ 6045c2aa98e2SPeter Wemm NULL 6046c2aa98e2SPeter Wemm }; 60473299c2f1SGregory Neil Shapiro 6048