17c478bd9Sstevel@tonic-gate /*
2*e9af4bc0SJohn Beck * Copyright (c) 1998-2009 Sendmail, Inc. and its suppliers.
37c478bd9Sstevel@tonic-gate * All rights reserved.
47c478bd9Sstevel@tonic-gate * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
57c478bd9Sstevel@tonic-gate * Copyright (c) 1988, 1993
67c478bd9Sstevel@tonic-gate * The Regents of the University of California. All rights reserved.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * By using this file, you agree to the terms and conditions set
97c478bd9Sstevel@tonic-gate * forth in the LICENSE file which can be found at the top level of
107c478bd9Sstevel@tonic-gate * the sendmail distribution.
117c478bd9Sstevel@tonic-gate *
127c478bd9Sstevel@tonic-gate */
137c478bd9Sstevel@tonic-gate
147c478bd9Sstevel@tonic-gate /*
15d25d47eeSjbeck * Copyright 1999-2006 Sun Microsystems, Inc. All rights reserved.
167c478bd9Sstevel@tonic-gate * Use is subject to license terms.
177c478bd9Sstevel@tonic-gate */
187c478bd9Sstevel@tonic-gate
197c478bd9Sstevel@tonic-gate #include <sendmail.h>
207c478bd9Sstevel@tonic-gate
21*e9af4bc0SJohn Beck SM_RCSID("@(#)$Id: conf.c,v 8.1153 2009/12/18 17:25:12 ca Exp $")
227c478bd9Sstevel@tonic-gate
23058561cbSjbeck #include <sm/sendmail.h>
247c478bd9Sstevel@tonic-gate #include <sendmail/pathnames.h>
257c478bd9Sstevel@tonic-gate #if NEWDB
267c478bd9Sstevel@tonic-gate # include "sm/bdb.h"
277c478bd9Sstevel@tonic-gate #endif /* NEWDB */
287c478bd9Sstevel@tonic-gate
29058561cbSjbeck #include <daemon.h>
30058561cbSjbeck #include "map.h"
31058561cbSjbeck
3249218d4fSjbeck #ifdef DEC
3349218d4fSjbeck # if NETINET6
3449218d4fSjbeck /* for the IPv6 device lookup */
3549218d4fSjbeck # define _SOCKADDR_LEN
3649218d4fSjbeck # include <macros.h>
3749218d4fSjbeck # endif /* NETINET6 */
3849218d4fSjbeck #endif /* DEC */
3949218d4fSjbeck
407c478bd9Sstevel@tonic-gate # include <sys/ioctl.h>
417c478bd9Sstevel@tonic-gate # include <sys/param.h>
427c478bd9Sstevel@tonic-gate
437c478bd9Sstevel@tonic-gate #include <limits.h>
447c478bd9Sstevel@tonic-gate #if NETINET || NETINET6
457c478bd9Sstevel@tonic-gate # include <arpa/inet.h>
467c478bd9Sstevel@tonic-gate #endif /* NETINET || NETINET6 */
477c478bd9Sstevel@tonic-gate #if HASULIMIT && defined(HPUX11)
487c478bd9Sstevel@tonic-gate # include <ulimit.h>
497c478bd9Sstevel@tonic-gate #endif /* HASULIMIT && defined(HPUX11) */
507c478bd9Sstevel@tonic-gate
517c478bd9Sstevel@tonic-gate static void setupmaps __P((void));
527c478bd9Sstevel@tonic-gate static void setupmailers __P((void));
537c478bd9Sstevel@tonic-gate static void setupqueues __P((void));
547c478bd9Sstevel@tonic-gate static int get_num_procs_online __P((void));
557c478bd9Sstevel@tonic-gate static int add_hostnames __P((SOCKADDR *));
567c478bd9Sstevel@tonic-gate
577c478bd9Sstevel@tonic-gate #if NETINET6 && NEEDSGETIPNODE
587c478bd9Sstevel@tonic-gate static struct hostent *getipnodebyname __P((char *, int, int, int *));
597c478bd9Sstevel@tonic-gate static struct hostent *getipnodebyaddr __P((char *, int, int, int *));
607c478bd9Sstevel@tonic-gate #endif /* NETINET6 && NEEDSGETIPNODE */
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate
637c478bd9Sstevel@tonic-gate /*
647c478bd9Sstevel@tonic-gate ** CONF.C -- Sendmail Configuration Tables.
657c478bd9Sstevel@tonic-gate **
667c478bd9Sstevel@tonic-gate ** Defines the configuration of this installation.
677c478bd9Sstevel@tonic-gate **
687c478bd9Sstevel@tonic-gate ** Configuration Variables:
697c478bd9Sstevel@tonic-gate ** HdrInfo -- a table describing well-known header fields.
707c478bd9Sstevel@tonic-gate ** Each entry has the field name and some flags,
717c478bd9Sstevel@tonic-gate ** which are described in sendmail.h.
727c478bd9Sstevel@tonic-gate **
737c478bd9Sstevel@tonic-gate ** Notes:
747c478bd9Sstevel@tonic-gate ** I have tried to put almost all the reasonable
757c478bd9Sstevel@tonic-gate ** configuration information into the configuration
767c478bd9Sstevel@tonic-gate ** file read at runtime. My intent is that anything
777c478bd9Sstevel@tonic-gate ** here is a function of the version of UNIX you
787c478bd9Sstevel@tonic-gate ** are running, or is really static -- for example
797c478bd9Sstevel@tonic-gate ** the headers are a superset of widely used
807c478bd9Sstevel@tonic-gate ** protocols. If you find yourself playing with
817c478bd9Sstevel@tonic-gate ** this file too much, you may be making a mistake!
827c478bd9Sstevel@tonic-gate */
837c478bd9Sstevel@tonic-gate
847c478bd9Sstevel@tonic-gate
857c478bd9Sstevel@tonic-gate /*
867c478bd9Sstevel@tonic-gate ** Header info table
877c478bd9Sstevel@tonic-gate ** Final (null) entry contains the flags used for any other field.
887c478bd9Sstevel@tonic-gate **
897c478bd9Sstevel@tonic-gate ** Not all of these are actually handled specially by sendmail
907c478bd9Sstevel@tonic-gate ** at this time. They are included as placeholders, to let
917c478bd9Sstevel@tonic-gate ** you know that "someday" I intend to have sendmail do
927c478bd9Sstevel@tonic-gate ** something with them.
937c478bd9Sstevel@tonic-gate */
947c478bd9Sstevel@tonic-gate
957c478bd9Sstevel@tonic-gate struct hdrinfo HdrInfo[] =
967c478bd9Sstevel@tonic-gate {
977c478bd9Sstevel@tonic-gate /* originator fields, most to least significant */
987c478bd9Sstevel@tonic-gate { "resent-sender", H_FROM|H_RESENT, NULL },
997c478bd9Sstevel@tonic-gate { "resent-from", H_FROM|H_RESENT, NULL },
1007c478bd9Sstevel@tonic-gate { "resent-reply-to", H_FROM|H_RESENT, NULL },
1017c478bd9Sstevel@tonic-gate { "sender", H_FROM, NULL },
1027c478bd9Sstevel@tonic-gate { "from", H_FROM, NULL },
1037c478bd9Sstevel@tonic-gate { "reply-to", H_FROM, NULL },
1047c478bd9Sstevel@tonic-gate { "errors-to", H_FROM|H_ERRORSTO, NULL },
1057c478bd9Sstevel@tonic-gate { "full-name", H_ACHECK, NULL },
1067c478bd9Sstevel@tonic-gate { "return-receipt-to", H_RECEIPTTO, NULL },
1077c478bd9Sstevel@tonic-gate { "delivery-receipt-to", H_RECEIPTTO, NULL },
1087c478bd9Sstevel@tonic-gate { "disposition-notification-to", H_FROM, NULL },
1097c478bd9Sstevel@tonic-gate
1107c478bd9Sstevel@tonic-gate /* destination fields */
1117c478bd9Sstevel@tonic-gate { "to", H_RCPT, NULL },
1127c478bd9Sstevel@tonic-gate { "resent-to", H_RCPT|H_RESENT, NULL },
1137c478bd9Sstevel@tonic-gate { "cc", H_RCPT, NULL },
1147c478bd9Sstevel@tonic-gate { "resent-cc", H_RCPT|H_RESENT, NULL },
1157c478bd9Sstevel@tonic-gate { "bcc", H_RCPT|H_BCC, NULL },
1167c478bd9Sstevel@tonic-gate { "resent-bcc", H_RCPT|H_BCC|H_RESENT, NULL },
1177c478bd9Sstevel@tonic-gate { "apparently-to", H_RCPT, NULL },
1187c478bd9Sstevel@tonic-gate
1197c478bd9Sstevel@tonic-gate /* message identification and control */
1207c478bd9Sstevel@tonic-gate { "message-id", 0, NULL },
1217c478bd9Sstevel@tonic-gate { "resent-message-id", H_RESENT, NULL },
1227c478bd9Sstevel@tonic-gate { "message", H_EOH, NULL },
1237c478bd9Sstevel@tonic-gate { "text", H_EOH, NULL },
1247c478bd9Sstevel@tonic-gate
1257c478bd9Sstevel@tonic-gate /* date fields */
1267c478bd9Sstevel@tonic-gate { "date", 0, NULL },
1277c478bd9Sstevel@tonic-gate { "resent-date", H_RESENT, NULL },
1287c478bd9Sstevel@tonic-gate
1297c478bd9Sstevel@tonic-gate /* trace fields */
1307c478bd9Sstevel@tonic-gate { "received", H_TRACE|H_FORCE, NULL },
1317c478bd9Sstevel@tonic-gate { "x400-received", H_TRACE|H_FORCE, NULL },
1327c478bd9Sstevel@tonic-gate { "via", H_TRACE|H_FORCE, NULL },
1337c478bd9Sstevel@tonic-gate { "mail-from", H_TRACE|H_FORCE, NULL },
1347c478bd9Sstevel@tonic-gate
1357c478bd9Sstevel@tonic-gate /* miscellaneous fields */
1367c478bd9Sstevel@tonic-gate { "comments", H_FORCE|H_ENCODABLE, NULL },
1377c478bd9Sstevel@tonic-gate { "return-path", H_FORCE|H_ACHECK|H_BINDLATE, NULL },
1387c478bd9Sstevel@tonic-gate { "content-transfer-encoding", H_CTE, NULL },
1397c478bd9Sstevel@tonic-gate { "content-type", H_CTYPE, NULL },
1407c478bd9Sstevel@tonic-gate { "content-length", H_ACHECK, NULL },
1417c478bd9Sstevel@tonic-gate { "subject", H_ENCODABLE, NULL },
1427c478bd9Sstevel@tonic-gate { "x-authentication-warning", H_FORCE, NULL },
1437c478bd9Sstevel@tonic-gate
1447c478bd9Sstevel@tonic-gate { NULL, 0, NULL }
1457c478bd9Sstevel@tonic-gate };
1467c478bd9Sstevel@tonic-gate
1477c478bd9Sstevel@tonic-gate
1487c478bd9Sstevel@tonic-gate
1497c478bd9Sstevel@tonic-gate /*
1507c478bd9Sstevel@tonic-gate ** Privacy values
1517c478bd9Sstevel@tonic-gate */
1527c478bd9Sstevel@tonic-gate
1537c478bd9Sstevel@tonic-gate struct prival PrivacyValues[] =
1547c478bd9Sstevel@tonic-gate {
1557c478bd9Sstevel@tonic-gate { "public", PRIV_PUBLIC },
1567c478bd9Sstevel@tonic-gate { "needmailhelo", PRIV_NEEDMAILHELO },
1577c478bd9Sstevel@tonic-gate { "needexpnhelo", PRIV_NEEDEXPNHELO },
1587c478bd9Sstevel@tonic-gate { "needvrfyhelo", PRIV_NEEDVRFYHELO },
1597c478bd9Sstevel@tonic-gate { "noexpn", PRIV_NOEXPN },
1607c478bd9Sstevel@tonic-gate { "novrfy", PRIV_NOVRFY },
1617c478bd9Sstevel@tonic-gate { "restrictexpand", PRIV_RESTRICTEXPAND },
1627c478bd9Sstevel@tonic-gate { "restrictmailq", PRIV_RESTRICTMAILQ },
1637c478bd9Sstevel@tonic-gate { "restrictqrun", PRIV_RESTRICTQRUN },
1647c478bd9Sstevel@tonic-gate { "noetrn", PRIV_NOETRN },
1657c478bd9Sstevel@tonic-gate { "noverb", PRIV_NOVERB },
1667c478bd9Sstevel@tonic-gate { "authwarnings", PRIV_AUTHWARNINGS },
1677c478bd9Sstevel@tonic-gate { "noreceipts", PRIV_NORECEIPTS },
1687c478bd9Sstevel@tonic-gate { "nobodyreturn", PRIV_NOBODYRETN },
1697c478bd9Sstevel@tonic-gate { "goaway", PRIV_GOAWAY },
1707c478bd9Sstevel@tonic-gate { "noactualrecipient", PRIV_NOACTUALRECIPIENT },
1717c478bd9Sstevel@tonic-gate { NULL, 0 }
1727c478bd9Sstevel@tonic-gate };
1737c478bd9Sstevel@tonic-gate
1747c478bd9Sstevel@tonic-gate /*
1757c478bd9Sstevel@tonic-gate ** DontBlameSendmail values
1767c478bd9Sstevel@tonic-gate */
1777c478bd9Sstevel@tonic-gate
1787c478bd9Sstevel@tonic-gate struct dbsval DontBlameSendmailValues[] =
1797c478bd9Sstevel@tonic-gate {
1807c478bd9Sstevel@tonic-gate { "safe", DBS_SAFE },
1817c478bd9Sstevel@tonic-gate { "assumesafechown", DBS_ASSUMESAFECHOWN },
1827c478bd9Sstevel@tonic-gate { "groupwritabledirpathsafe", DBS_GROUPWRITABLEDIRPATHSAFE },
1837c478bd9Sstevel@tonic-gate { "groupwritableforwardfilesafe",
1847c478bd9Sstevel@tonic-gate DBS_GROUPWRITABLEFORWARDFILESAFE },
1857c478bd9Sstevel@tonic-gate { "groupwritableincludefilesafe",
1867c478bd9Sstevel@tonic-gate DBS_GROUPWRITABLEINCLUDEFILESAFE },
1877c478bd9Sstevel@tonic-gate { "groupwritablealiasfile", DBS_GROUPWRITABLEALIASFILE },
1887c478bd9Sstevel@tonic-gate { "worldwritablealiasfile", DBS_WORLDWRITABLEALIASFILE },
1897c478bd9Sstevel@tonic-gate { "forwardfileinunsafedirpath", DBS_FORWARDFILEINUNSAFEDIRPATH },
1907c478bd9Sstevel@tonic-gate { "includefileinunsafedirpath", DBS_INCLUDEFILEINUNSAFEDIRPATH },
1917c478bd9Sstevel@tonic-gate { "mapinunsafedirpath", DBS_MAPINUNSAFEDIRPATH },
1927c478bd9Sstevel@tonic-gate { "linkedaliasfileinwritabledir",
1937c478bd9Sstevel@tonic-gate DBS_LINKEDALIASFILEINWRITABLEDIR },
1947c478bd9Sstevel@tonic-gate { "linkedclassfileinwritabledir",
1957c478bd9Sstevel@tonic-gate DBS_LINKEDCLASSFILEINWRITABLEDIR },
1967c478bd9Sstevel@tonic-gate { "linkedforwardfileinwritabledir",
1977c478bd9Sstevel@tonic-gate DBS_LINKEDFORWARDFILEINWRITABLEDIR },
1987c478bd9Sstevel@tonic-gate { "linkedincludefileinwritabledir",
1997c478bd9Sstevel@tonic-gate DBS_LINKEDINCLUDEFILEINWRITABLEDIR },
2007c478bd9Sstevel@tonic-gate { "linkedmapinwritabledir", DBS_LINKEDMAPINWRITABLEDIR },
2017c478bd9Sstevel@tonic-gate { "linkedserviceswitchfileinwritabledir",
2027c478bd9Sstevel@tonic-gate DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR },
2037c478bd9Sstevel@tonic-gate { "filedeliverytohardlink", DBS_FILEDELIVERYTOHARDLINK },
2047c478bd9Sstevel@tonic-gate { "filedeliverytosymlink", DBS_FILEDELIVERYTOSYMLINK },
2057c478bd9Sstevel@tonic-gate { "writemaptohardlink", DBS_WRITEMAPTOHARDLINK },
2067c478bd9Sstevel@tonic-gate { "writemaptosymlink", DBS_WRITEMAPTOSYMLINK },
2077c478bd9Sstevel@tonic-gate { "writestatstohardlink", DBS_WRITESTATSTOHARDLINK },
2087c478bd9Sstevel@tonic-gate { "writestatstosymlink", DBS_WRITESTATSTOSYMLINK },
2097c478bd9Sstevel@tonic-gate { "forwardfileingroupwritabledirpath",
2107c478bd9Sstevel@tonic-gate DBS_FORWARDFILEINGROUPWRITABLEDIRPATH },
2117c478bd9Sstevel@tonic-gate { "includefileingroupwritabledirpath",
2127c478bd9Sstevel@tonic-gate DBS_INCLUDEFILEINGROUPWRITABLEDIRPATH },
2137c478bd9Sstevel@tonic-gate { "classfileinunsafedirpath", DBS_CLASSFILEINUNSAFEDIRPATH },
2147c478bd9Sstevel@tonic-gate { "errorheaderinunsafedirpath", DBS_ERRORHEADERINUNSAFEDIRPATH },
2157c478bd9Sstevel@tonic-gate { "helpfileinunsafedirpath", DBS_HELPFILEINUNSAFEDIRPATH },
2167c478bd9Sstevel@tonic-gate { "forwardfileinunsafedirpathsafe",
2177c478bd9Sstevel@tonic-gate DBS_FORWARDFILEINUNSAFEDIRPATHSAFE },
2187c478bd9Sstevel@tonic-gate { "includefileinunsafedirpathsafe",
2197c478bd9Sstevel@tonic-gate DBS_INCLUDEFILEINUNSAFEDIRPATHSAFE },
2207c478bd9Sstevel@tonic-gate { "runprograminunsafedirpath", DBS_RUNPROGRAMINUNSAFEDIRPATH },
2217c478bd9Sstevel@tonic-gate { "runwritableprogram", DBS_RUNWRITABLEPROGRAM },
2227c478bd9Sstevel@tonic-gate { "nonrootsafeaddr", DBS_NONROOTSAFEADDR },
2237c478bd9Sstevel@tonic-gate { "truststickybit", DBS_TRUSTSTICKYBIT },
2247c478bd9Sstevel@tonic-gate { "dontwarnforwardfileinunsafedirpath",
2257c478bd9Sstevel@tonic-gate DBS_DONTWARNFORWARDFILEINUNSAFEDIRPATH },
2267c478bd9Sstevel@tonic-gate { "insufficiententropy", DBS_INSUFFICIENTENTROPY },
2277c478bd9Sstevel@tonic-gate { "groupreadablesasldbfile", DBS_GROUPREADABLESASLDBFILE },
2287c478bd9Sstevel@tonic-gate { "groupwritablesasldbfile", DBS_GROUPWRITABLESASLDBFILE },
2297c478bd9Sstevel@tonic-gate { "groupwritableforwardfile", DBS_GROUPWRITABLEFORWARDFILE },
2307c478bd9Sstevel@tonic-gate { "groupwritableincludefile", DBS_GROUPWRITABLEINCLUDEFILE },
2317c478bd9Sstevel@tonic-gate { "worldwritableforwardfile", DBS_WORLDWRITABLEFORWARDFILE },
2327c478bd9Sstevel@tonic-gate { "worldwritableincludefile", DBS_WORLDWRITABLEINCLUDEFILE },
2337c478bd9Sstevel@tonic-gate { "groupreadablekeyfile", DBS_GROUPREADABLEKEYFILE },
2347c478bd9Sstevel@tonic-gate #if _FFR_GROUPREADABLEAUTHINFOFILE
2357c478bd9Sstevel@tonic-gate { "groupreadableadefaultauthinfofile",
2367c478bd9Sstevel@tonic-gate DBS_GROUPREADABLEAUTHINFOFILE },
2377c478bd9Sstevel@tonic-gate #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */
2387c478bd9Sstevel@tonic-gate { NULL, 0 }
2397c478bd9Sstevel@tonic-gate };
2407c478bd9Sstevel@tonic-gate
2417c478bd9Sstevel@tonic-gate /*
2427c478bd9Sstevel@tonic-gate ** Miscellaneous stuff.
2437c478bd9Sstevel@tonic-gate */
2447c478bd9Sstevel@tonic-gate
2457c478bd9Sstevel@tonic-gate int DtableSize = 50; /* max open files; reset in 4.2bsd */
2467c478bd9Sstevel@tonic-gate /*
2477c478bd9Sstevel@tonic-gate ** SETDEFAULTS -- set default values
2487c478bd9Sstevel@tonic-gate **
2497c478bd9Sstevel@tonic-gate ** Some of these must be initialized using direct code since they
2507c478bd9Sstevel@tonic-gate ** depend on run-time values. So let's do all of them this way.
2517c478bd9Sstevel@tonic-gate **
2527c478bd9Sstevel@tonic-gate ** Parameters:
2537c478bd9Sstevel@tonic-gate ** e -- the default envelope.
2547c478bd9Sstevel@tonic-gate **
2557c478bd9Sstevel@tonic-gate ** Returns:
2567c478bd9Sstevel@tonic-gate ** none.
2577c478bd9Sstevel@tonic-gate **
2587c478bd9Sstevel@tonic-gate ** Side Effects:
2597c478bd9Sstevel@tonic-gate ** Initializes a bunch of global variables to their
2607c478bd9Sstevel@tonic-gate ** default values.
2617c478bd9Sstevel@tonic-gate */
2627c478bd9Sstevel@tonic-gate
2637c478bd9Sstevel@tonic-gate #define MINUTES * 60
2647c478bd9Sstevel@tonic-gate #define HOURS * 60 MINUTES
2657c478bd9Sstevel@tonic-gate #define DAYS * 24 HOURS
2667c478bd9Sstevel@tonic-gate
2677c478bd9Sstevel@tonic-gate #ifndef MAXRULERECURSION
2687c478bd9Sstevel@tonic-gate # define MAXRULERECURSION 50 /* max ruleset recursion depth */
2697c478bd9Sstevel@tonic-gate #endif /* ! MAXRULERECURSION */
2707c478bd9Sstevel@tonic-gate
2717c478bd9Sstevel@tonic-gate void
setdefaults(e)2727c478bd9Sstevel@tonic-gate setdefaults(e)
2737c478bd9Sstevel@tonic-gate register ENVELOPE *e;
2747c478bd9Sstevel@tonic-gate {
2757c478bd9Sstevel@tonic-gate int i;
2767c478bd9Sstevel@tonic-gate int numprocs;
2777c478bd9Sstevel@tonic-gate struct passwd *pw;
2787c478bd9Sstevel@tonic-gate
2797c478bd9Sstevel@tonic-gate numprocs = get_num_procs_online();
2807c478bd9Sstevel@tonic-gate SpaceSub = ' '; /* option B */
2817c478bd9Sstevel@tonic-gate QueueLA = 8 * numprocs; /* option x */
2827c478bd9Sstevel@tonic-gate RefuseLA = 12 * numprocs; /* option X */
2837c478bd9Sstevel@tonic-gate WkRecipFact = 30000L; /* option y */
2847c478bd9Sstevel@tonic-gate WkClassFact = 1800L; /* option z */
2857c478bd9Sstevel@tonic-gate WkTimeFact = 90000L; /* option Z */
2867c478bd9Sstevel@tonic-gate QueueFactor = WkRecipFact * 20; /* option q */
2877c478bd9Sstevel@tonic-gate QueueMode = QM_NORMAL; /* what queue items to act upon */
2887c478bd9Sstevel@tonic-gate FileMode = (RealUid != geteuid()) ? 0644 : 0600;
2897c478bd9Sstevel@tonic-gate /* option F */
2907c478bd9Sstevel@tonic-gate QueueFileMode = (RealUid != geteuid()) ? 0644 : 0600;
2917c478bd9Sstevel@tonic-gate /* option QueueFileMode */
2927c478bd9Sstevel@tonic-gate
2937c478bd9Sstevel@tonic-gate if (((pw = sm_getpwnam("mailnull")) != NULL && pw->pw_uid != 0) ||
2947c478bd9Sstevel@tonic-gate ((pw = sm_getpwnam("sendmail")) != NULL && pw->pw_uid != 0) ||
2957c478bd9Sstevel@tonic-gate ((pw = sm_getpwnam("daemon")) != NULL && pw->pw_uid != 0))
2967c478bd9Sstevel@tonic-gate {
2977c478bd9Sstevel@tonic-gate DefUid = pw->pw_uid; /* option u */
2987c478bd9Sstevel@tonic-gate DefGid = pw->pw_gid; /* option g */
2997c478bd9Sstevel@tonic-gate DefUser = newstr(pw->pw_name);
3007c478bd9Sstevel@tonic-gate }
3017c478bd9Sstevel@tonic-gate else
3027c478bd9Sstevel@tonic-gate {
3037c478bd9Sstevel@tonic-gate DefUid = 1; /* option u */
3047c478bd9Sstevel@tonic-gate DefGid = 1; /* option g */
3057c478bd9Sstevel@tonic-gate setdefuser();
3067c478bd9Sstevel@tonic-gate }
3077c478bd9Sstevel@tonic-gate TrustedUid = 0;
3087c478bd9Sstevel@tonic-gate if (tTd(37, 4))
3097c478bd9Sstevel@tonic-gate sm_dprintf("setdefaults: DefUser=%s, DefUid=%d, DefGid=%d\n",
3107c478bd9Sstevel@tonic-gate DefUser != NULL ? DefUser : "<1:1>",
3117c478bd9Sstevel@tonic-gate (int) DefUid, (int) DefGid);
3127c478bd9Sstevel@tonic-gate CheckpointInterval = 10; /* option C */
3137c478bd9Sstevel@tonic-gate MaxHopCount = 25; /* option h */
3147c478bd9Sstevel@tonic-gate set_delivery_mode(SM_FORK, e); /* option d */
3157c478bd9Sstevel@tonic-gate e->e_errormode = EM_PRINT; /* option e */
3167c478bd9Sstevel@tonic-gate e->e_qgrp = NOQGRP;
3177c478bd9Sstevel@tonic-gate e->e_qdir = NOQDIR;
3187c478bd9Sstevel@tonic-gate e->e_xfqgrp = NOQGRP;
3197c478bd9Sstevel@tonic-gate e->e_xfqdir = NOQDIR;
3207c478bd9Sstevel@tonic-gate e->e_ctime = curtime();
3217c478bd9Sstevel@tonic-gate SevenBitInput = false; /* option 7 */
3227c478bd9Sstevel@tonic-gate MaxMciCache = 1; /* option k */
3237c478bd9Sstevel@tonic-gate MciCacheTimeout = 5 MINUTES; /* option K */
3247c478bd9Sstevel@tonic-gate LogLevel = 9; /* option L */
3257c478bd9Sstevel@tonic-gate #if MILTER
3267c478bd9Sstevel@tonic-gate MilterLogLevel = -1;
3277c478bd9Sstevel@tonic-gate #endif /* MILTER */
3287c478bd9Sstevel@tonic-gate inittimeouts(NULL, false); /* option r */
3297c478bd9Sstevel@tonic-gate PrivacyFlags = PRIV_PUBLIC; /* option p */
3307c478bd9Sstevel@tonic-gate MeToo = true; /* option m */
3317c478bd9Sstevel@tonic-gate SendMIMEErrors = true; /* option f */
3327c478bd9Sstevel@tonic-gate SuperSafe = SAFE_REALLY; /* option s */
3337c478bd9Sstevel@tonic-gate clrbitmap(DontBlameSendmail); /* DontBlameSendmail option */
3347c478bd9Sstevel@tonic-gate #if MIME8TO7
3357c478bd9Sstevel@tonic-gate MimeMode = MM_CVTMIME|MM_PASS8BIT; /* option 8 */
3367c478bd9Sstevel@tonic-gate #else /* MIME8TO7 */
3377c478bd9Sstevel@tonic-gate MimeMode = MM_PASS8BIT;
3387c478bd9Sstevel@tonic-gate #endif /* MIME8TO7 */
3397c478bd9Sstevel@tonic-gate for (i = 0; i < MAXTOCLASS; i++)
3407c478bd9Sstevel@tonic-gate {
3417c478bd9Sstevel@tonic-gate TimeOuts.to_q_return[i] = 5 DAYS; /* option T */
3427c478bd9Sstevel@tonic-gate TimeOuts.to_q_warning[i] = 0; /* option T */
3437c478bd9Sstevel@tonic-gate }
3447c478bd9Sstevel@tonic-gate ServiceSwitchFile = "/etc/mail/service.switch";
3457c478bd9Sstevel@tonic-gate ServiceCacheMaxAge = (time_t) 10;
3467c478bd9Sstevel@tonic-gate HostsFile = _PATH_HOSTS;
3477c478bd9Sstevel@tonic-gate PidFile = newstr(_PATH_SENDMAILPID);
3487c478bd9Sstevel@tonic-gate MustQuoteChars = "@,;:\\()[].'";
3497c478bd9Sstevel@tonic-gate MciInfoTimeout = 30 MINUTES;
3507c478bd9Sstevel@tonic-gate MaxRuleRecursion = MAXRULERECURSION;
3517c478bd9Sstevel@tonic-gate MaxAliasRecursion = 10;
3527c478bd9Sstevel@tonic-gate MaxMacroRecursion = 10;
3537c478bd9Sstevel@tonic-gate ColonOkInAddr = true;
3547c478bd9Sstevel@tonic-gate DontLockReadFiles = true;
3557c478bd9Sstevel@tonic-gate DontProbeInterfaces = DPI_PROBEALL;
3567c478bd9Sstevel@tonic-gate DoubleBounceAddr = "postmaster";
3577c478bd9Sstevel@tonic-gate MaxHeadersLength = MAXHDRSLEN;
3587c478bd9Sstevel@tonic-gate MaxMimeHeaderLength = MAXLINE;
3597c478bd9Sstevel@tonic-gate MaxMimeFieldLength = MaxMimeHeaderLength / 2;
3607c478bd9Sstevel@tonic-gate MaxForwardEntries = 0;
3617c478bd9Sstevel@tonic-gate FastSplit = 1;
362445f2479Sjbeck MaxNOOPCommands = MAXNOOPCOMMANDS;
3637c478bd9Sstevel@tonic-gate #if SASL
3647c478bd9Sstevel@tonic-gate AuthMechanisms = newstr(AUTH_MECHANISMS);
3657c478bd9Sstevel@tonic-gate AuthRealm = NULL;
3667c478bd9Sstevel@tonic-gate MaxSLBits = INT_MAX;
3677c478bd9Sstevel@tonic-gate #endif /* SASL */
3687c478bd9Sstevel@tonic-gate #if STARTTLS
3697c478bd9Sstevel@tonic-gate TLS_Srv_Opts = TLS_I_SRV;
3707c478bd9Sstevel@tonic-gate #endif /* STARTTLS */
3717c478bd9Sstevel@tonic-gate #ifdef HESIOD_INIT
3727c478bd9Sstevel@tonic-gate HesiodContext = NULL;
3737c478bd9Sstevel@tonic-gate #endif /* HESIOD_INIT */
3747c478bd9Sstevel@tonic-gate #if NETINET6
3757c478bd9Sstevel@tonic-gate /* Detect if IPv6 is available at run time */
3767c478bd9Sstevel@tonic-gate i = socket(AF_INET6, SOCK_STREAM, 0);
3777c478bd9Sstevel@tonic-gate if (i >= 0)
3787c478bd9Sstevel@tonic-gate {
3797c478bd9Sstevel@tonic-gate InetMode = AF_INET6;
3807c478bd9Sstevel@tonic-gate (void) close(i);
3817c478bd9Sstevel@tonic-gate }
3827c478bd9Sstevel@tonic-gate else
3837c478bd9Sstevel@tonic-gate InetMode = AF_INET;
3847c478bd9Sstevel@tonic-gate #else /* NETINET6 */
3857c478bd9Sstevel@tonic-gate InetMode = AF_INET;
3867c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
3877c478bd9Sstevel@tonic-gate ControlSocketName = NULL;
388058561cbSjbeck memset(&ConnectOnlyTo, '\0', sizeof(ConnectOnlyTo));
3897c478bd9Sstevel@tonic-gate DataFileBufferSize = 4096;
3907c478bd9Sstevel@tonic-gate XscriptFileBufferSize = 4096;
3917c478bd9Sstevel@tonic-gate for (i = 0; i < MAXRWSETS; i++)
3927c478bd9Sstevel@tonic-gate RuleSetNames[i] = NULL;
3937c478bd9Sstevel@tonic-gate #if MILTER
3947c478bd9Sstevel@tonic-gate InputFilters[0] = NULL;
3957c478bd9Sstevel@tonic-gate #endif /* MILTER */
3967c478bd9Sstevel@tonic-gate RejectLogInterval = 3 HOURS;
3977c478bd9Sstevel@tonic-gate #if REQUIRES_DIR_FSYNC
3987c478bd9Sstevel@tonic-gate RequiresDirfsync = true;
3997c478bd9Sstevel@tonic-gate #endif /* REQUIRES_DIR_FSYNC */
400*e9af4bc0SJohn Beck #if _FFR_RCPTTHROTDELAY
401*e9af4bc0SJohn Beck BadRcptThrottleDelay = 1;
402*e9af4bc0SJohn Beck #endif /* _FFR_RCPTTHROTDELAY */
4037c478bd9Sstevel@tonic-gate ConnectionRateWindowSize = 60;
4047c478bd9Sstevel@tonic-gate setupmaps();
4057c478bd9Sstevel@tonic-gate setupqueues();
4067c478bd9Sstevel@tonic-gate setupmailers();
4077c478bd9Sstevel@tonic-gate setupheaders();
4087c478bd9Sstevel@tonic-gate }
4097c478bd9Sstevel@tonic-gate
4107c478bd9Sstevel@tonic-gate
4117c478bd9Sstevel@tonic-gate /*
4127c478bd9Sstevel@tonic-gate ** SETDEFUSER -- set/reset DefUser using DefUid (for initgroups())
4137c478bd9Sstevel@tonic-gate */
4147c478bd9Sstevel@tonic-gate
4157c478bd9Sstevel@tonic-gate void
setdefuser()4167c478bd9Sstevel@tonic-gate setdefuser()
4177c478bd9Sstevel@tonic-gate {
4187c478bd9Sstevel@tonic-gate struct passwd *defpwent;
4197c478bd9Sstevel@tonic-gate static char defuserbuf[40];
4207c478bd9Sstevel@tonic-gate
4217c478bd9Sstevel@tonic-gate DefUser = defuserbuf;
4227c478bd9Sstevel@tonic-gate defpwent = sm_getpwuid(DefUid);
4237c478bd9Sstevel@tonic-gate (void) sm_strlcpy(defuserbuf,
4247c478bd9Sstevel@tonic-gate (defpwent == NULL || defpwent->pw_name == NULL)
4257c478bd9Sstevel@tonic-gate ? "nobody" : defpwent->pw_name,
426058561cbSjbeck sizeof(defuserbuf));
4277c478bd9Sstevel@tonic-gate if (tTd(37, 4))
4287c478bd9Sstevel@tonic-gate sm_dprintf("setdefuser: DefUid=%d, DefUser=%s\n",
4297c478bd9Sstevel@tonic-gate (int) DefUid, DefUser);
4307c478bd9Sstevel@tonic-gate }
4317c478bd9Sstevel@tonic-gate /*
4327c478bd9Sstevel@tonic-gate ** SETUPQUEUES -- initialize default queues
4337c478bd9Sstevel@tonic-gate **
4347c478bd9Sstevel@tonic-gate ** The mqueue QUEUE structure gets filled in after readcf() but
4357c478bd9Sstevel@tonic-gate ** we need something to point to now for the mailer setup,
4367c478bd9Sstevel@tonic-gate ** which use "mqueue" as default queue.
4377c478bd9Sstevel@tonic-gate */
4387c478bd9Sstevel@tonic-gate
4397c478bd9Sstevel@tonic-gate static void
setupqueues()4407c478bd9Sstevel@tonic-gate setupqueues()
4417c478bd9Sstevel@tonic-gate {
4427c478bd9Sstevel@tonic-gate char buf[100];
4437c478bd9Sstevel@tonic-gate
4447c478bd9Sstevel@tonic-gate MaxRunnersPerQueue = 1;
445058561cbSjbeck (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof(buf));
4467c478bd9Sstevel@tonic-gate makequeue(buf, false);
4477c478bd9Sstevel@tonic-gate }
4487c478bd9Sstevel@tonic-gate /*
4497c478bd9Sstevel@tonic-gate ** SETUPMAILERS -- initialize default mailers
4507c478bd9Sstevel@tonic-gate */
4517c478bd9Sstevel@tonic-gate
4527c478bd9Sstevel@tonic-gate static void
setupmailers()4537c478bd9Sstevel@tonic-gate setupmailers()
4547c478bd9Sstevel@tonic-gate {
4557c478bd9Sstevel@tonic-gate char buf[100];
4567c478bd9Sstevel@tonic-gate
4577c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u",
458058561cbSjbeck sizeof(buf));
4597c478bd9Sstevel@tonic-gate makemailer(buf);
4607c478bd9Sstevel@tonic-gate
4617c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=X-Unix/X-Unix/X-Unix, A=FILE \201u",
462058561cbSjbeck sizeof(buf));
4637c478bd9Sstevel@tonic-gate makemailer(buf);
4647c478bd9Sstevel@tonic-gate
4657c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u",
466058561cbSjbeck sizeof(buf));
4677c478bd9Sstevel@tonic-gate makemailer(buf);
4687c478bd9Sstevel@tonic-gate initerrmailers();
4697c478bd9Sstevel@tonic-gate }
4707c478bd9Sstevel@tonic-gate /*
4717c478bd9Sstevel@tonic-gate ** SETUPMAPS -- set up map classes
4727c478bd9Sstevel@tonic-gate */
4737c478bd9Sstevel@tonic-gate
4747c478bd9Sstevel@tonic-gate #define MAPDEF(name, ext, flags, parse, open, close, lookup, store) \
4757c478bd9Sstevel@tonic-gate { \
4767c478bd9Sstevel@tonic-gate extern bool parse __P((MAP *, char *)); \
4777c478bd9Sstevel@tonic-gate extern bool open __P((MAP *, int)); \
4787c478bd9Sstevel@tonic-gate extern void close __P((MAP *)); \
4797c478bd9Sstevel@tonic-gate extern char *lookup __P((MAP *, char *, char **, int *)); \
4807c478bd9Sstevel@tonic-gate extern void store __P((MAP *, char *, char *)); \
4817c478bd9Sstevel@tonic-gate s = stab(name, ST_MAPCLASS, ST_ENTER); \
4827c478bd9Sstevel@tonic-gate s->s_mapclass.map_cname = name; \
4837c478bd9Sstevel@tonic-gate s->s_mapclass.map_ext = ext; \
4847c478bd9Sstevel@tonic-gate s->s_mapclass.map_cflags = flags; \
4857c478bd9Sstevel@tonic-gate s->s_mapclass.map_parse = parse; \
4867c478bd9Sstevel@tonic-gate s->s_mapclass.map_open = open; \
4877c478bd9Sstevel@tonic-gate s->s_mapclass.map_close = close; \
4887c478bd9Sstevel@tonic-gate s->s_mapclass.map_lookup = lookup; \
4897c478bd9Sstevel@tonic-gate s->s_mapclass.map_store = store; \
4907c478bd9Sstevel@tonic-gate }
4917c478bd9Sstevel@tonic-gate
4927c478bd9Sstevel@tonic-gate static void
setupmaps()4937c478bd9Sstevel@tonic-gate setupmaps()
4947c478bd9Sstevel@tonic-gate {
4957c478bd9Sstevel@tonic-gate register STAB *s;
4967c478bd9Sstevel@tonic-gate
4977c478bd9Sstevel@tonic-gate #if NEWDB
4987c478bd9Sstevel@tonic-gate # if DB_VERSION_MAJOR > 1
4997c478bd9Sstevel@tonic-gate int major_v, minor_v, patch_v;
5007c478bd9Sstevel@tonic-gate
5017c478bd9Sstevel@tonic-gate (void) db_version(&major_v, &minor_v, &patch_v);
5027c478bd9Sstevel@tonic-gate if (major_v != DB_VERSION_MAJOR || minor_v != DB_VERSION_MINOR)
5037c478bd9Sstevel@tonic-gate {
5047c478bd9Sstevel@tonic-gate errno = 0;
5057c478bd9Sstevel@tonic-gate syserr("Berkeley DB version mismatch: compiled against %d.%d.%d, run-time linked against %d.%d.%d",
5067c478bd9Sstevel@tonic-gate DB_VERSION_MAJOR, DB_VERSION_MINOR, DB_VERSION_PATCH,
5077c478bd9Sstevel@tonic-gate major_v, minor_v, patch_v);
5087c478bd9Sstevel@tonic-gate }
5097c478bd9Sstevel@tonic-gate # endif /* DB_VERSION_MAJOR > 1 */
5107c478bd9Sstevel@tonic-gate
5117c478bd9Sstevel@tonic-gate MAPDEF("hash", ".db", MCF_ALIASOK|MCF_REBUILDABLE,
5127c478bd9Sstevel@tonic-gate map_parseargs, hash_map_open, db_map_close,
5137c478bd9Sstevel@tonic-gate db_map_lookup, db_map_store);
5147c478bd9Sstevel@tonic-gate
5157c478bd9Sstevel@tonic-gate MAPDEF("btree", ".db", MCF_ALIASOK|MCF_REBUILDABLE,
5167c478bd9Sstevel@tonic-gate map_parseargs, bt_map_open, db_map_close,
5177c478bd9Sstevel@tonic-gate db_map_lookup, db_map_store);
5187c478bd9Sstevel@tonic-gate #endif /* NEWDB */
5197c478bd9Sstevel@tonic-gate
5207c478bd9Sstevel@tonic-gate #if NDBM
5217c478bd9Sstevel@tonic-gate MAPDEF("dbm", ".dir", MCF_ALIASOK|MCF_REBUILDABLE,
5227c478bd9Sstevel@tonic-gate map_parseargs, ndbm_map_open, ndbm_map_close,
5237c478bd9Sstevel@tonic-gate ndbm_map_lookup, ndbm_map_store);
5247c478bd9Sstevel@tonic-gate #endif /* NDBM */
5257c478bd9Sstevel@tonic-gate
5267c478bd9Sstevel@tonic-gate #if NIS
5277c478bd9Sstevel@tonic-gate MAPDEF("nis", NULL, MCF_ALIASOK,
5287c478bd9Sstevel@tonic-gate map_parseargs, nis_map_open, null_map_close,
5297c478bd9Sstevel@tonic-gate nis_map_lookup, null_map_store);
5307c478bd9Sstevel@tonic-gate #endif /* NIS */
5317c478bd9Sstevel@tonic-gate
5327c478bd9Sstevel@tonic-gate #if NISPLUS
5337c478bd9Sstevel@tonic-gate MAPDEF("nisplus", NULL, MCF_ALIASOK,
5347c478bd9Sstevel@tonic-gate map_parseargs, nisplus_map_open, null_map_close,
5357c478bd9Sstevel@tonic-gate nisplus_map_lookup, null_map_store);
5367c478bd9Sstevel@tonic-gate #endif /* NISPLUS */
5377c478bd9Sstevel@tonic-gate
5387c478bd9Sstevel@tonic-gate #if LDAPMAP
5397c478bd9Sstevel@tonic-gate MAPDEF("ldap", NULL, MCF_ALIASOK|MCF_NOTPERSIST,
5407c478bd9Sstevel@tonic-gate ldapmap_parseargs, ldapmap_open, ldapmap_close,
5417c478bd9Sstevel@tonic-gate ldapmap_lookup, null_map_store);
5427c478bd9Sstevel@tonic-gate #endif /* LDAPMAP */
5437c478bd9Sstevel@tonic-gate
5447c478bd9Sstevel@tonic-gate #if PH_MAP
5457c478bd9Sstevel@tonic-gate MAPDEF("ph", NULL, MCF_NOTPERSIST,
5467c478bd9Sstevel@tonic-gate ph_map_parseargs, ph_map_open, ph_map_close,
5477c478bd9Sstevel@tonic-gate ph_map_lookup, null_map_store);
5487c478bd9Sstevel@tonic-gate #endif /* PH_MAP */
5497c478bd9Sstevel@tonic-gate
5507c478bd9Sstevel@tonic-gate #if MAP_NSD
5517c478bd9Sstevel@tonic-gate /* IRIX 6.5 nsd support */
5527c478bd9Sstevel@tonic-gate MAPDEF("nsd", NULL, MCF_ALIASOK,
5537c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
5547c478bd9Sstevel@tonic-gate nsd_map_lookup, null_map_store);
5557c478bd9Sstevel@tonic-gate #endif /* MAP_NSD */
5567c478bd9Sstevel@tonic-gate
5577c478bd9Sstevel@tonic-gate #if HESIOD
5587c478bd9Sstevel@tonic-gate MAPDEF("hesiod", NULL, MCF_ALIASOK|MCF_ALIASONLY,
5597c478bd9Sstevel@tonic-gate map_parseargs, hes_map_open, hes_map_close,
5607c478bd9Sstevel@tonic-gate hes_map_lookup, null_map_store);
5617c478bd9Sstevel@tonic-gate #endif /* HESIOD */
5627c478bd9Sstevel@tonic-gate
5637c478bd9Sstevel@tonic-gate #if NETINFO
5647c478bd9Sstevel@tonic-gate MAPDEF("netinfo", NULL, MCF_ALIASOK,
5657c478bd9Sstevel@tonic-gate map_parseargs, ni_map_open, null_map_close,
5667c478bd9Sstevel@tonic-gate ni_map_lookup, null_map_store);
5677c478bd9Sstevel@tonic-gate #endif /* NETINFO */
5687c478bd9Sstevel@tonic-gate
5697c478bd9Sstevel@tonic-gate #if 0
5707c478bd9Sstevel@tonic-gate MAPDEF("dns", NULL, 0,
5717c478bd9Sstevel@tonic-gate dns_map_init, null_map_open, null_map_close,
5727c478bd9Sstevel@tonic-gate dns_map_lookup, null_map_store);
5737c478bd9Sstevel@tonic-gate #endif /* 0 */
5747c478bd9Sstevel@tonic-gate
5757c478bd9Sstevel@tonic-gate #if NAMED_BIND
5767c478bd9Sstevel@tonic-gate # if DNSMAP
5777c478bd9Sstevel@tonic-gate # if _FFR_DNSMAP_ALIASABLE
5787c478bd9Sstevel@tonic-gate MAPDEF("dns", NULL, MCF_ALIASOK,
5797c478bd9Sstevel@tonic-gate dns_map_parseargs, dns_map_open, null_map_close,
5807c478bd9Sstevel@tonic-gate dns_map_lookup, null_map_store);
5817c478bd9Sstevel@tonic-gate # else /* _FFR_DNSMAP_ALIASABLE */
5827c478bd9Sstevel@tonic-gate MAPDEF("dns", NULL, 0,
5837c478bd9Sstevel@tonic-gate dns_map_parseargs, dns_map_open, null_map_close,
5847c478bd9Sstevel@tonic-gate dns_map_lookup, null_map_store);
5857c478bd9Sstevel@tonic-gate # endif /* _FFR_DNSMAP_ALIASABLE */
5867c478bd9Sstevel@tonic-gate # endif /* DNSMAP */
5877c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
5887c478bd9Sstevel@tonic-gate
5897c478bd9Sstevel@tonic-gate #if NAMED_BIND
5907c478bd9Sstevel@tonic-gate /* best MX DNS lookup */
5917c478bd9Sstevel@tonic-gate MAPDEF("bestmx", NULL, MCF_OPTFILE,
5927c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
5937c478bd9Sstevel@tonic-gate bestmx_map_lookup, null_map_store);
5947c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
5957c478bd9Sstevel@tonic-gate
5967c478bd9Sstevel@tonic-gate MAPDEF("host", NULL, 0,
5977c478bd9Sstevel@tonic-gate host_map_init, null_map_open, null_map_close,
5987c478bd9Sstevel@tonic-gate host_map_lookup, null_map_store);
5997c478bd9Sstevel@tonic-gate
6007c478bd9Sstevel@tonic-gate MAPDEF("text", NULL, MCF_ALIASOK,
6017c478bd9Sstevel@tonic-gate map_parseargs, text_map_open, null_map_close,
6027c478bd9Sstevel@tonic-gate text_map_lookup, null_map_store);
6037c478bd9Sstevel@tonic-gate
6047c478bd9Sstevel@tonic-gate MAPDEF("stab", NULL, MCF_ALIASOK|MCF_ALIASONLY,
6057c478bd9Sstevel@tonic-gate map_parseargs, stab_map_open, null_map_close,
6067c478bd9Sstevel@tonic-gate stab_map_lookup, stab_map_store);
6077c478bd9Sstevel@tonic-gate
6087c478bd9Sstevel@tonic-gate MAPDEF("implicit", NULL, MCF_ALIASOK|MCF_ALIASONLY|MCF_REBUILDABLE,
6097c478bd9Sstevel@tonic-gate map_parseargs, impl_map_open, impl_map_close,
6107c478bd9Sstevel@tonic-gate impl_map_lookup, impl_map_store);
6117c478bd9Sstevel@tonic-gate
6127c478bd9Sstevel@tonic-gate /* access to system passwd file */
6137c478bd9Sstevel@tonic-gate MAPDEF("user", NULL, MCF_OPTFILE,
6147c478bd9Sstevel@tonic-gate map_parseargs, user_map_open, null_map_close,
6157c478bd9Sstevel@tonic-gate user_map_lookup, null_map_store);
6167c478bd9Sstevel@tonic-gate
6177c478bd9Sstevel@tonic-gate /* dequote map */
6187c478bd9Sstevel@tonic-gate MAPDEF("dequote", NULL, 0,
6197c478bd9Sstevel@tonic-gate dequote_init, null_map_open, null_map_close,
6207c478bd9Sstevel@tonic-gate dequote_map, null_map_store);
6217c478bd9Sstevel@tonic-gate
6227c478bd9Sstevel@tonic-gate #if MAP_REGEX
6237c478bd9Sstevel@tonic-gate MAPDEF("regex", NULL, 0,
6247c478bd9Sstevel@tonic-gate regex_map_init, null_map_open, null_map_close,
6257c478bd9Sstevel@tonic-gate regex_map_lookup, null_map_store);
6267c478bd9Sstevel@tonic-gate #endif /* MAP_REGEX */
6277c478bd9Sstevel@tonic-gate
6287c478bd9Sstevel@tonic-gate #if USERDB
6297c478bd9Sstevel@tonic-gate /* user database */
6307c478bd9Sstevel@tonic-gate MAPDEF("userdb", ".db", 0,
6317c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
6327c478bd9Sstevel@tonic-gate udb_map_lookup, null_map_store);
6337c478bd9Sstevel@tonic-gate #endif /* USERDB */
6347c478bd9Sstevel@tonic-gate
6357c478bd9Sstevel@tonic-gate /* arbitrary programs */
6367c478bd9Sstevel@tonic-gate MAPDEF("program", NULL, MCF_ALIASOK,
6377c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
6387c478bd9Sstevel@tonic-gate prog_map_lookup, null_map_store);
6397c478bd9Sstevel@tonic-gate
6407c478bd9Sstevel@tonic-gate /* sequenced maps */
6417c478bd9Sstevel@tonic-gate MAPDEF("sequence", NULL, MCF_ALIASOK,
6427c478bd9Sstevel@tonic-gate seq_map_parse, null_map_open, null_map_close,
6437c478bd9Sstevel@tonic-gate seq_map_lookup, seq_map_store);
6447c478bd9Sstevel@tonic-gate
6457c478bd9Sstevel@tonic-gate /* switched interface to sequenced maps */
6467c478bd9Sstevel@tonic-gate MAPDEF("switch", NULL, MCF_ALIASOK,
6477c478bd9Sstevel@tonic-gate map_parseargs, switch_map_open, null_map_close,
6487c478bd9Sstevel@tonic-gate seq_map_lookup, seq_map_store);
6497c478bd9Sstevel@tonic-gate
6507c478bd9Sstevel@tonic-gate /* null map lookup -- really for internal use only */
6517c478bd9Sstevel@tonic-gate MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE,
6527c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
6537c478bd9Sstevel@tonic-gate null_map_lookup, null_map_store);
6547c478bd9Sstevel@tonic-gate
6557c478bd9Sstevel@tonic-gate /* syslog map -- logs information to syslog */
6567c478bd9Sstevel@tonic-gate MAPDEF("syslog", NULL, 0,
6577c478bd9Sstevel@tonic-gate syslog_map_parseargs, null_map_open, null_map_close,
6587c478bd9Sstevel@tonic-gate syslog_map_lookup, null_map_store);
6597c478bd9Sstevel@tonic-gate
6607c478bd9Sstevel@tonic-gate /* macro storage map -- rulesets can set macros */
6617c478bd9Sstevel@tonic-gate MAPDEF("macro", NULL, 0,
6627c478bd9Sstevel@tonic-gate dequote_init, null_map_open, null_map_close,
6637c478bd9Sstevel@tonic-gate macro_map_lookup, null_map_store);
6647c478bd9Sstevel@tonic-gate
6657c478bd9Sstevel@tonic-gate /* arithmetic map -- add/subtract/compare */
6667c478bd9Sstevel@tonic-gate MAPDEF("arith", NULL, 0,
6677c478bd9Sstevel@tonic-gate dequote_init, null_map_open, null_map_close,
6687c478bd9Sstevel@tonic-gate arith_map_lookup, null_map_store);
6697c478bd9Sstevel@tonic-gate
6707c478bd9Sstevel@tonic-gate #if SOCKETMAP
6717c478bd9Sstevel@tonic-gate /* arbitrary daemons */
6727c478bd9Sstevel@tonic-gate MAPDEF("socket", NULL, MCF_ALIASOK,
6737c478bd9Sstevel@tonic-gate map_parseargs, socket_map_open, socket_map_close,
6747c478bd9Sstevel@tonic-gate socket_map_lookup, null_map_store);
6757c478bd9Sstevel@tonic-gate #endif /* SOCKETMAP */
6767c478bd9Sstevel@tonic-gate
677058561cbSjbeck #if _FFR_DPRINTF_MAP
678058561cbSjbeck /* dprintf map -- logs information to syslog */
679058561cbSjbeck MAPDEF("dprintf", NULL, 0,
680058561cbSjbeck dprintf_map_parseargs, null_map_open, null_map_close,
681058561cbSjbeck dprintf_map_lookup, null_map_store);
682058561cbSjbeck #endif /* _FFR_DPRINTF_MAP */
683058561cbSjbeck
6847c478bd9Sstevel@tonic-gate if (tTd(38, 2))
6857c478bd9Sstevel@tonic-gate {
6867c478bd9Sstevel@tonic-gate /* bogus map -- always return tempfail */
6877c478bd9Sstevel@tonic-gate MAPDEF("bogus", NULL, MCF_ALIASOK|MCF_OPTFILE,
6887c478bd9Sstevel@tonic-gate map_parseargs, null_map_open, null_map_close,
6897c478bd9Sstevel@tonic-gate bogus_map_lookup, null_map_store);
6907c478bd9Sstevel@tonic-gate }
6917c478bd9Sstevel@tonic-gate }
6927c478bd9Sstevel@tonic-gate
6937c478bd9Sstevel@tonic-gate #undef MAPDEF
6947c478bd9Sstevel@tonic-gate /*
6957c478bd9Sstevel@tonic-gate ** INITHOSTMAPS -- initial host-dependent maps
6967c478bd9Sstevel@tonic-gate **
6977c478bd9Sstevel@tonic-gate ** This should act as an interface to any local service switch
6987c478bd9Sstevel@tonic-gate ** provided by the host operating system.
6997c478bd9Sstevel@tonic-gate **
7007c478bd9Sstevel@tonic-gate ** Parameters:
7017c478bd9Sstevel@tonic-gate ** none
7027c478bd9Sstevel@tonic-gate **
7037c478bd9Sstevel@tonic-gate ** Returns:
7047c478bd9Sstevel@tonic-gate ** none
7057c478bd9Sstevel@tonic-gate **
7067c478bd9Sstevel@tonic-gate ** Side Effects:
7077c478bd9Sstevel@tonic-gate ** Should define maps "host" and "users" as necessary
7087c478bd9Sstevel@tonic-gate ** for this OS. If they are not defined, they will get
7097c478bd9Sstevel@tonic-gate ** a default value later. It should check to make sure
7107c478bd9Sstevel@tonic-gate ** they are not defined first, since it's possible that
7117c478bd9Sstevel@tonic-gate ** the config file has provided an override.
7127c478bd9Sstevel@tonic-gate */
7137c478bd9Sstevel@tonic-gate
7147c478bd9Sstevel@tonic-gate void
inithostmaps()7157c478bd9Sstevel@tonic-gate inithostmaps()
7167c478bd9Sstevel@tonic-gate {
7177c478bd9Sstevel@tonic-gate register int i;
7187c478bd9Sstevel@tonic-gate int nmaps;
7197c478bd9Sstevel@tonic-gate char *maptype[MAXMAPSTACK];
7207c478bd9Sstevel@tonic-gate short mapreturn[MAXMAPACTIONS];
7217c478bd9Sstevel@tonic-gate char buf[MAXLINE];
7227c478bd9Sstevel@tonic-gate
7237c478bd9Sstevel@tonic-gate /*
7247c478bd9Sstevel@tonic-gate ** Make sure we have a host map.
7257c478bd9Sstevel@tonic-gate */
7267c478bd9Sstevel@tonic-gate
7277c478bd9Sstevel@tonic-gate if (stab("host", ST_MAP, ST_FIND) == NULL)
7287c478bd9Sstevel@tonic-gate {
7297c478bd9Sstevel@tonic-gate /* user didn't initialize: set up host map */
730058561cbSjbeck (void) sm_strlcpy(buf, "host host", sizeof(buf));
7317c478bd9Sstevel@tonic-gate #if NAMED_BIND
7327c478bd9Sstevel@tonic-gate if (ConfigLevel >= 2)
733058561cbSjbeck (void) sm_strlcat(buf, " -a. -D", sizeof(buf));
7347c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
7357c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7367c478bd9Sstevel@tonic-gate }
7377c478bd9Sstevel@tonic-gate
7387c478bd9Sstevel@tonic-gate /*
7397c478bd9Sstevel@tonic-gate ** Set up default aliases maps
7407c478bd9Sstevel@tonic-gate */
7417c478bd9Sstevel@tonic-gate
7427c478bd9Sstevel@tonic-gate nmaps = switch_map_find("aliases", maptype, mapreturn);
7437c478bd9Sstevel@tonic-gate for (i = 0; i < nmaps; i++)
7447c478bd9Sstevel@tonic-gate {
7457c478bd9Sstevel@tonic-gate if (strcmp(maptype[i], "files") == 0 &&
7467c478bd9Sstevel@tonic-gate stab("aliases.files", ST_MAP, ST_FIND) == NULL)
7477c478bd9Sstevel@tonic-gate {
7487c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "aliases.files null",
749058561cbSjbeck sizeof(buf));
7507c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7517c478bd9Sstevel@tonic-gate }
7527c478bd9Sstevel@tonic-gate #if NISPLUS
7537c478bd9Sstevel@tonic-gate else if (strcmp(maptype[i], "nisplus") == 0 &&
7547c478bd9Sstevel@tonic-gate stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL)
7557c478bd9Sstevel@tonic-gate {
7567c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion mail_aliases.org_dir",
757058561cbSjbeck sizeof(buf));
7587c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7597c478bd9Sstevel@tonic-gate }
7607c478bd9Sstevel@tonic-gate #endif /* NISPLUS */
7617c478bd9Sstevel@tonic-gate #if NIS
7627c478bd9Sstevel@tonic-gate else if (strcmp(maptype[i], "nis") == 0 &&
7637c478bd9Sstevel@tonic-gate stab("aliases.nis", ST_MAP, ST_FIND) == NULL)
7647c478bd9Sstevel@tonic-gate {
7657c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "aliases.nis nis mail.aliases",
766058561cbSjbeck sizeof(buf));
7677c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7687c478bd9Sstevel@tonic-gate }
7697c478bd9Sstevel@tonic-gate #endif /* NIS */
7707c478bd9Sstevel@tonic-gate #if NETINFO
7717c478bd9Sstevel@tonic-gate else if (strcmp(maptype[i], "netinfo") == 0 &&
7727c478bd9Sstevel@tonic-gate stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL)
7737c478bd9Sstevel@tonic-gate {
7747c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "aliases.netinfo netinfo -z, /aliases",
775058561cbSjbeck sizeof(buf));
7767c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7777c478bd9Sstevel@tonic-gate }
7787c478bd9Sstevel@tonic-gate #endif /* NETINFO */
7797c478bd9Sstevel@tonic-gate #if HESIOD
7807c478bd9Sstevel@tonic-gate else if (strcmp(maptype[i], "hesiod") == 0 &&
7817c478bd9Sstevel@tonic-gate stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL)
7827c478bd9Sstevel@tonic-gate {
7837c478bd9Sstevel@tonic-gate (void) sm_strlcpy(buf, "aliases.hesiod hesiod aliases",
784058561cbSjbeck sizeof(buf));
7857c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7867c478bd9Sstevel@tonic-gate }
7877c478bd9Sstevel@tonic-gate #endif /* HESIOD */
788d25d47eeSjbeck #if LDAPMAP && defined(SUN_EXTENSIONS) && \
789d25d47eeSjbeck defined(SUN_SIMPLIFIED_LDAP) && HASLDAPGETALIASBYNAME
7907c478bd9Sstevel@tonic-gate else if (strcmp(maptype[i], "ldap") == 0 &&
7917c478bd9Sstevel@tonic-gate stab("aliases.ldap", ST_MAP, ST_FIND) == NULL)
7927c478bd9Sstevel@tonic-gate {
793*e9af4bc0SJohn Beck (void) sm_strlcpy(buf, "aliases.ldap ldap -b . -h localhost -k mail=%0 -v mailgroup",
7947c478bd9Sstevel@tonic-gate sizeof buf);
7957c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
7967c478bd9Sstevel@tonic-gate }
797d25d47eeSjbeck #endif /* LDAPMAP && defined(SUN_EXTENSIONS) && ... */
7987c478bd9Sstevel@tonic-gate }
7997c478bd9Sstevel@tonic-gate if (stab("aliases", ST_MAP, ST_FIND) == NULL)
8007c478bd9Sstevel@tonic-gate {
801058561cbSjbeck (void) sm_strlcpy(buf, "aliases switch aliases", sizeof(buf));
8027c478bd9Sstevel@tonic-gate (void) makemapentry(buf);
8037c478bd9Sstevel@tonic-gate }
804058561cbSjbeck }
8057c478bd9Sstevel@tonic-gate
8067c478bd9Sstevel@tonic-gate /*
8077c478bd9Sstevel@tonic-gate ** SWITCH_MAP_FIND -- find the list of types associated with a map
8087c478bd9Sstevel@tonic-gate **
8097c478bd9Sstevel@tonic-gate ** This is the system-dependent interface to the service switch.
8107c478bd9Sstevel@tonic-gate **
8117c478bd9Sstevel@tonic-gate ** Parameters:
8127c478bd9Sstevel@tonic-gate ** service -- the name of the service of interest.
8137c478bd9Sstevel@tonic-gate ** maptype -- an out-array of strings containing the types
8147c478bd9Sstevel@tonic-gate ** of access to use for this service. There can
8157c478bd9Sstevel@tonic-gate ** be at most MAXMAPSTACK types for a single service.
8167c478bd9Sstevel@tonic-gate ** mapreturn -- an out-array of return information bitmaps
8177c478bd9Sstevel@tonic-gate ** for the map.
8187c478bd9Sstevel@tonic-gate **
8197c478bd9Sstevel@tonic-gate ** Returns:
8207c478bd9Sstevel@tonic-gate ** The number of map types filled in, or -1 for failure.
8217c478bd9Sstevel@tonic-gate **
8227c478bd9Sstevel@tonic-gate ** Side effects:
8237c478bd9Sstevel@tonic-gate ** Preserves errno so nothing in the routine clobbers it.
8247c478bd9Sstevel@tonic-gate */
8257c478bd9Sstevel@tonic-gate
8267c478bd9Sstevel@tonic-gate #if defined(SOLARIS) || (defined(sony_news) && defined(__svr4))
8277c478bd9Sstevel@tonic-gate # define _USE_SUN_NSSWITCH_
8287c478bd9Sstevel@tonic-gate #endif /* defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) */
8297c478bd9Sstevel@tonic-gate
8307c478bd9Sstevel@tonic-gate #if _FFR_HPUX_NSSWITCH
8317c478bd9Sstevel@tonic-gate # ifdef __hpux
8327c478bd9Sstevel@tonic-gate # define _USE_SUN_NSSWITCH_
8337c478bd9Sstevel@tonic-gate # endif /* __hpux */
8347c478bd9Sstevel@tonic-gate #endif /* _FFR_HPUX_NSSWITCH */
8357c478bd9Sstevel@tonic-gate
8367c478bd9Sstevel@tonic-gate #ifdef _USE_SUN_NSSWITCH_
8377c478bd9Sstevel@tonic-gate # include <nsswitch.h>
8387c478bd9Sstevel@tonic-gate #endif /* _USE_SUN_NSSWITCH_ */
8397c478bd9Sstevel@tonic-gate
8407c478bd9Sstevel@tonic-gate #if defined(ultrix) || (defined(__osf__) && defined(__alpha))
8417c478bd9Sstevel@tonic-gate # define _USE_DEC_SVC_CONF_
8427c478bd9Sstevel@tonic-gate #endif /* defined(ultrix) || (defined(__osf__) && defined(__alpha)) */
8437c478bd9Sstevel@tonic-gate
8447c478bd9Sstevel@tonic-gate #ifdef _USE_DEC_SVC_CONF_
8457c478bd9Sstevel@tonic-gate # include <sys/svcinfo.h>
8467c478bd9Sstevel@tonic-gate #endif /* _USE_DEC_SVC_CONF_ */
8477c478bd9Sstevel@tonic-gate
8487c478bd9Sstevel@tonic-gate int
switch_map_find(service,maptype,mapreturn)8497c478bd9Sstevel@tonic-gate switch_map_find(service, maptype, mapreturn)
8507c478bd9Sstevel@tonic-gate char *service;
8517c478bd9Sstevel@tonic-gate char *maptype[MAXMAPSTACK];
8527c478bd9Sstevel@tonic-gate short mapreturn[MAXMAPACTIONS];
8537c478bd9Sstevel@tonic-gate {
8547c478bd9Sstevel@tonic-gate int svcno = 0;
8557c478bd9Sstevel@tonic-gate int save_errno = errno;
8567c478bd9Sstevel@tonic-gate
8577c478bd9Sstevel@tonic-gate #ifdef _USE_SUN_NSSWITCH_
8587c478bd9Sstevel@tonic-gate struct __nsw_switchconfig *nsw_conf;
8597c478bd9Sstevel@tonic-gate enum __nsw_parse_err pserr;
8607c478bd9Sstevel@tonic-gate struct __nsw_lookup *lk;
8617c478bd9Sstevel@tonic-gate static struct __nsw_lookup lkp0 =
8627c478bd9Sstevel@tonic-gate { "files", {1, 0, 0, 0}, NULL, NULL };
8637c478bd9Sstevel@tonic-gate static struct __nsw_switchconfig lkp_default =
8647c478bd9Sstevel@tonic-gate { 0, "sendmail", 3, &lkp0 };
8657c478bd9Sstevel@tonic-gate
8667c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < MAXMAPACTIONS; svcno++)
8677c478bd9Sstevel@tonic-gate mapreturn[svcno] = 0;
8687c478bd9Sstevel@tonic-gate
8697c478bd9Sstevel@tonic-gate if ((nsw_conf = __nsw_getconfig(service, &pserr)) == NULL)
8707c478bd9Sstevel@tonic-gate lk = lkp_default.lookups;
8717c478bd9Sstevel@tonic-gate else
8727c478bd9Sstevel@tonic-gate lk = nsw_conf->lookups;
8737c478bd9Sstevel@tonic-gate svcno = 0;
8747c478bd9Sstevel@tonic-gate while (lk != NULL && svcno < MAXMAPSTACK)
8757c478bd9Sstevel@tonic-gate {
8767c478bd9Sstevel@tonic-gate maptype[svcno] = lk->service_name;
8777c478bd9Sstevel@tonic-gate if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN)
8787c478bd9Sstevel@tonic-gate mapreturn[MA_NOTFOUND] |= 1 << svcno;
8797c478bd9Sstevel@tonic-gate if (lk->actions[__NSW_TRYAGAIN] == __NSW_RETURN)
8807c478bd9Sstevel@tonic-gate mapreturn[MA_TRYAGAIN] |= 1 << svcno;
8817c478bd9Sstevel@tonic-gate if (lk->actions[__NSW_UNAVAIL] == __NSW_RETURN)
8827c478bd9Sstevel@tonic-gate mapreturn[MA_TRYAGAIN] |= 1 << svcno;
8837c478bd9Sstevel@tonic-gate svcno++;
8847c478bd9Sstevel@tonic-gate lk = lk->next;
8857c478bd9Sstevel@tonic-gate }
8867c478bd9Sstevel@tonic-gate errno = save_errno;
8877c478bd9Sstevel@tonic-gate return svcno;
8887c478bd9Sstevel@tonic-gate #endif /* _USE_SUN_NSSWITCH_ */
8897c478bd9Sstevel@tonic-gate
8907c478bd9Sstevel@tonic-gate #ifdef _USE_DEC_SVC_CONF_
8917c478bd9Sstevel@tonic-gate struct svcinfo *svcinfo;
8927c478bd9Sstevel@tonic-gate int svc;
8937c478bd9Sstevel@tonic-gate
8947c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < MAXMAPACTIONS; svcno++)
8957c478bd9Sstevel@tonic-gate mapreturn[svcno] = 0;
8967c478bd9Sstevel@tonic-gate
8977c478bd9Sstevel@tonic-gate svcinfo = getsvc();
8987c478bd9Sstevel@tonic-gate if (svcinfo == NULL)
8997c478bd9Sstevel@tonic-gate goto punt;
9007c478bd9Sstevel@tonic-gate if (strcmp(service, "hosts") == 0)
9017c478bd9Sstevel@tonic-gate svc = SVC_HOSTS;
9027c478bd9Sstevel@tonic-gate else if (strcmp(service, "aliases") == 0)
9037c478bd9Sstevel@tonic-gate svc = SVC_ALIASES;
9047c478bd9Sstevel@tonic-gate else if (strcmp(service, "passwd") == 0)
9057c478bd9Sstevel@tonic-gate svc = SVC_PASSWD;
9067c478bd9Sstevel@tonic-gate else
9077c478bd9Sstevel@tonic-gate {
9087c478bd9Sstevel@tonic-gate errno = save_errno;
9097c478bd9Sstevel@tonic-gate return -1;
9107c478bd9Sstevel@tonic-gate }
9117c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < SVC_PATHSIZE && svcno < MAXMAPSTACK; svcno++)
9127c478bd9Sstevel@tonic-gate {
9137c478bd9Sstevel@tonic-gate switch (svcinfo->svcpath[svc][svcno])
9147c478bd9Sstevel@tonic-gate {
9157c478bd9Sstevel@tonic-gate case SVC_LOCAL:
9167c478bd9Sstevel@tonic-gate maptype[svcno] = "files";
9177c478bd9Sstevel@tonic-gate break;
9187c478bd9Sstevel@tonic-gate
9197c478bd9Sstevel@tonic-gate case SVC_YP:
9207c478bd9Sstevel@tonic-gate maptype[svcno] = "nis";
9217c478bd9Sstevel@tonic-gate break;
9227c478bd9Sstevel@tonic-gate
9237c478bd9Sstevel@tonic-gate case SVC_BIND:
9247c478bd9Sstevel@tonic-gate maptype[svcno] = "dns";
9257c478bd9Sstevel@tonic-gate break;
9267c478bd9Sstevel@tonic-gate
9277c478bd9Sstevel@tonic-gate # ifdef SVC_HESIOD
9287c478bd9Sstevel@tonic-gate case SVC_HESIOD:
9297c478bd9Sstevel@tonic-gate maptype[svcno] = "hesiod";
9307c478bd9Sstevel@tonic-gate break;
9317c478bd9Sstevel@tonic-gate # endif /* SVC_HESIOD */
9327c478bd9Sstevel@tonic-gate
9337c478bd9Sstevel@tonic-gate case SVC_LAST:
9347c478bd9Sstevel@tonic-gate errno = save_errno;
9357c478bd9Sstevel@tonic-gate return svcno;
9367c478bd9Sstevel@tonic-gate }
9377c478bd9Sstevel@tonic-gate }
9387c478bd9Sstevel@tonic-gate errno = save_errno;
9397c478bd9Sstevel@tonic-gate return svcno;
9407c478bd9Sstevel@tonic-gate #endif /* _USE_DEC_SVC_CONF_ */
9417c478bd9Sstevel@tonic-gate
9427c478bd9Sstevel@tonic-gate #if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_)
9437c478bd9Sstevel@tonic-gate /*
9447c478bd9Sstevel@tonic-gate ** Fall-back mechanism.
9457c478bd9Sstevel@tonic-gate */
9467c478bd9Sstevel@tonic-gate
9477c478bd9Sstevel@tonic-gate STAB *st;
9487c478bd9Sstevel@tonic-gate static time_t servicecachetime; /* time service switch was cached */
9497c478bd9Sstevel@tonic-gate time_t now = curtime();
9507c478bd9Sstevel@tonic-gate
9517c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < MAXMAPACTIONS; svcno++)
9527c478bd9Sstevel@tonic-gate mapreturn[svcno] = 0;
9537c478bd9Sstevel@tonic-gate
9547c478bd9Sstevel@tonic-gate if ((now - servicecachetime) > (time_t) ServiceCacheMaxAge)
9557c478bd9Sstevel@tonic-gate {
9567c478bd9Sstevel@tonic-gate /* (re)read service switch */
9577c478bd9Sstevel@tonic-gate register SM_FILE_T *fp;
9587c478bd9Sstevel@tonic-gate long sff = SFF_REGONLY|SFF_OPENASROOT|SFF_NOLOCK;
9597c478bd9Sstevel@tonic-gate
9607c478bd9Sstevel@tonic-gate if (!bitnset(DBS_LINKEDSERVICESWITCHFILEINWRITABLEDIR,
9617c478bd9Sstevel@tonic-gate DontBlameSendmail))
9627c478bd9Sstevel@tonic-gate sff |= SFF_NOWLINK;
9637c478bd9Sstevel@tonic-gate
9647c478bd9Sstevel@tonic-gate if (ConfigFileRead)
9657c478bd9Sstevel@tonic-gate servicecachetime = now;
9667c478bd9Sstevel@tonic-gate fp = safefopen(ServiceSwitchFile, O_RDONLY, 0, sff);
9677c478bd9Sstevel@tonic-gate if (fp != NULL)
9687c478bd9Sstevel@tonic-gate {
9697c478bd9Sstevel@tonic-gate char buf[MAXLINE];
9707c478bd9Sstevel@tonic-gate
9717c478bd9Sstevel@tonic-gate while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf,
972058561cbSjbeck sizeof(buf)) != NULL)
9737c478bd9Sstevel@tonic-gate {
9747c478bd9Sstevel@tonic-gate register char *p;
9757c478bd9Sstevel@tonic-gate
9767c478bd9Sstevel@tonic-gate p = strpbrk(buf, "#\n");
9777c478bd9Sstevel@tonic-gate if (p != NULL)
9787c478bd9Sstevel@tonic-gate *p = '\0';
979*e9af4bc0SJohn Beck #ifndef SM_NSSWITCH_DELIMS
980*e9af4bc0SJohn Beck # define SM_NSSWITCH_DELIMS " \t"
981*e9af4bc0SJohn Beck #endif /* SM_NSSWITCH_DELIMS */
982*e9af4bc0SJohn Beck p = strpbrk(buf, SM_NSSWITCH_DELIMS);
9837c478bd9Sstevel@tonic-gate if (p != NULL)
9847c478bd9Sstevel@tonic-gate *p++ = '\0';
9857c478bd9Sstevel@tonic-gate if (buf[0] == '\0')
9867c478bd9Sstevel@tonic-gate continue;
9877c478bd9Sstevel@tonic-gate if (p == NULL)
9887c478bd9Sstevel@tonic-gate {
9897c478bd9Sstevel@tonic-gate sm_syslog(LOG_ERR, NOQID,
9907c478bd9Sstevel@tonic-gate "Bad line on %.100s: %.100s",
9917c478bd9Sstevel@tonic-gate ServiceSwitchFile,
9927c478bd9Sstevel@tonic-gate buf);
9937c478bd9Sstevel@tonic-gate continue;
9947c478bd9Sstevel@tonic-gate }
995*e9af4bc0SJohn Beck while (isascii(*p) && isspace(*p))
9967c478bd9Sstevel@tonic-gate p++;
9977c478bd9Sstevel@tonic-gate if (*p == '\0')
9987c478bd9Sstevel@tonic-gate continue;
9997c478bd9Sstevel@tonic-gate
10007c478bd9Sstevel@tonic-gate /*
10017c478bd9Sstevel@tonic-gate ** Find/allocate space for this service entry.
10027c478bd9Sstevel@tonic-gate ** Space for all of the service strings
10037c478bd9Sstevel@tonic-gate ** are allocated at once. This means
10047c478bd9Sstevel@tonic-gate ** that we only have to free the first
10057c478bd9Sstevel@tonic-gate ** one to free all of them.
10067c478bd9Sstevel@tonic-gate */
10077c478bd9Sstevel@tonic-gate
10087c478bd9Sstevel@tonic-gate st = stab(buf, ST_SERVICE, ST_ENTER);
10097c478bd9Sstevel@tonic-gate if (st->s_service[0] != NULL)
10107c478bd9Sstevel@tonic-gate sm_free((void *) st->s_service[0]); /* XXX */
10117c478bd9Sstevel@tonic-gate p = newstr(p);
10127c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < MAXMAPSTACK; )
10137c478bd9Sstevel@tonic-gate {
10147c478bd9Sstevel@tonic-gate if (*p == '\0')
10157c478bd9Sstevel@tonic-gate break;
10167c478bd9Sstevel@tonic-gate st->s_service[svcno++] = p;
10177c478bd9Sstevel@tonic-gate p = strpbrk(p, " \t");
10187c478bd9Sstevel@tonic-gate if (p == NULL)
10197c478bd9Sstevel@tonic-gate break;
10207c478bd9Sstevel@tonic-gate *p++ = '\0';
1021*e9af4bc0SJohn Beck while (isascii(*p) && isspace(*p))
10227c478bd9Sstevel@tonic-gate p++;
10237c478bd9Sstevel@tonic-gate }
10247c478bd9Sstevel@tonic-gate if (svcno < MAXMAPSTACK)
10257c478bd9Sstevel@tonic-gate st->s_service[svcno] = NULL;
10267c478bd9Sstevel@tonic-gate }
10277c478bd9Sstevel@tonic-gate (void) sm_io_close(fp, SM_TIME_DEFAULT);
10287c478bd9Sstevel@tonic-gate }
10297c478bd9Sstevel@tonic-gate }
10307c478bd9Sstevel@tonic-gate
10317c478bd9Sstevel@tonic-gate /* look up entry in cache */
10327c478bd9Sstevel@tonic-gate st = stab(service, ST_SERVICE, ST_FIND);
10337c478bd9Sstevel@tonic-gate if (st != NULL && st->s_service[0] != NULL)
10347c478bd9Sstevel@tonic-gate {
10357c478bd9Sstevel@tonic-gate /* extract data */
10367c478bd9Sstevel@tonic-gate svcno = 0;
10377c478bd9Sstevel@tonic-gate while (svcno < MAXMAPSTACK)
10387c478bd9Sstevel@tonic-gate {
10397c478bd9Sstevel@tonic-gate maptype[svcno] = st->s_service[svcno];
10407c478bd9Sstevel@tonic-gate if (maptype[svcno++] == NULL)
10417c478bd9Sstevel@tonic-gate break;
10427c478bd9Sstevel@tonic-gate }
10437c478bd9Sstevel@tonic-gate errno = save_errno;
10447c478bd9Sstevel@tonic-gate return --svcno;
10457c478bd9Sstevel@tonic-gate }
10467c478bd9Sstevel@tonic-gate #endif /* !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) */
10477c478bd9Sstevel@tonic-gate
10487c478bd9Sstevel@tonic-gate #if !defined(_USE_SUN_NSSWITCH_)
10497c478bd9Sstevel@tonic-gate /* if the service file doesn't work, use an absolute fallback */
10507c478bd9Sstevel@tonic-gate # ifdef _USE_DEC_SVC_CONF_
10517c478bd9Sstevel@tonic-gate punt:
10527c478bd9Sstevel@tonic-gate # endif /* _USE_DEC_SVC_CONF_ */
10537c478bd9Sstevel@tonic-gate for (svcno = 0; svcno < MAXMAPACTIONS; svcno++)
10547c478bd9Sstevel@tonic-gate mapreturn[svcno] = 0;
10557c478bd9Sstevel@tonic-gate svcno = 0;
10567c478bd9Sstevel@tonic-gate if (strcmp(service, "aliases") == 0)
10577c478bd9Sstevel@tonic-gate {
10587c478bd9Sstevel@tonic-gate maptype[svcno++] = "files";
10597c478bd9Sstevel@tonic-gate # if defined(AUTO_NETINFO_ALIASES) && defined (NETINFO)
10607c478bd9Sstevel@tonic-gate maptype[svcno++] = "netinfo";
10617c478bd9Sstevel@tonic-gate # endif /* defined(AUTO_NETINFO_ALIASES) && defined (NETINFO) */
10627c478bd9Sstevel@tonic-gate # ifdef AUTO_NIS_ALIASES
10637c478bd9Sstevel@tonic-gate # if NISPLUS
10647c478bd9Sstevel@tonic-gate maptype[svcno++] = "nisplus";
10657c478bd9Sstevel@tonic-gate # endif /* NISPLUS */
10667c478bd9Sstevel@tonic-gate # if NIS
10677c478bd9Sstevel@tonic-gate maptype[svcno++] = "nis";
10687c478bd9Sstevel@tonic-gate # endif /* NIS */
10697c478bd9Sstevel@tonic-gate # endif /* AUTO_NIS_ALIASES */
10707c478bd9Sstevel@tonic-gate errno = save_errno;
10717c478bd9Sstevel@tonic-gate return svcno;
10727c478bd9Sstevel@tonic-gate }
10737c478bd9Sstevel@tonic-gate if (strcmp(service, "hosts") == 0)
10747c478bd9Sstevel@tonic-gate {
10757c478bd9Sstevel@tonic-gate # if NAMED_BIND
10767c478bd9Sstevel@tonic-gate maptype[svcno++] = "dns";
10777c478bd9Sstevel@tonic-gate # else /* NAMED_BIND */
10787c478bd9Sstevel@tonic-gate # if defined(sun) && !defined(BSD)
10797c478bd9Sstevel@tonic-gate /* SunOS */
10807c478bd9Sstevel@tonic-gate maptype[svcno++] = "nis";
10817c478bd9Sstevel@tonic-gate # endif /* defined(sun) && !defined(BSD) */
10827c478bd9Sstevel@tonic-gate # endif /* NAMED_BIND */
10837c478bd9Sstevel@tonic-gate # if defined(AUTO_NETINFO_HOSTS) && defined (NETINFO)
10847c478bd9Sstevel@tonic-gate maptype[svcno++] = "netinfo";
10857c478bd9Sstevel@tonic-gate # endif /* defined(AUTO_NETINFO_HOSTS) && defined (NETINFO) */
10867c478bd9Sstevel@tonic-gate maptype[svcno++] = "files";
10877c478bd9Sstevel@tonic-gate errno = save_errno;
10887c478bd9Sstevel@tonic-gate return svcno;
10897c478bd9Sstevel@tonic-gate }
10907c478bd9Sstevel@tonic-gate errno = save_errno;
10917c478bd9Sstevel@tonic-gate return -1;
10927c478bd9Sstevel@tonic-gate #endif /* !defined(_USE_SUN_NSSWITCH_) */
10937c478bd9Sstevel@tonic-gate }
10947c478bd9Sstevel@tonic-gate /*
10957c478bd9Sstevel@tonic-gate ** USERNAME -- return the user id of the logged in user.
10967c478bd9Sstevel@tonic-gate **
10977c478bd9Sstevel@tonic-gate ** Parameters:
10987c478bd9Sstevel@tonic-gate ** none.
10997c478bd9Sstevel@tonic-gate **
11007c478bd9Sstevel@tonic-gate ** Returns:
11017c478bd9Sstevel@tonic-gate ** The login name of the logged in user.
11027c478bd9Sstevel@tonic-gate **
11037c478bd9Sstevel@tonic-gate ** Side Effects:
11047c478bd9Sstevel@tonic-gate ** none.
11057c478bd9Sstevel@tonic-gate **
11067c478bd9Sstevel@tonic-gate ** Notes:
11077c478bd9Sstevel@tonic-gate ** The return value is statically allocated.
11087c478bd9Sstevel@tonic-gate */
11097c478bd9Sstevel@tonic-gate
11107c478bd9Sstevel@tonic-gate char *
username()11117c478bd9Sstevel@tonic-gate username()
11127c478bd9Sstevel@tonic-gate {
11137c478bd9Sstevel@tonic-gate static char *myname = NULL;
11147c478bd9Sstevel@tonic-gate extern char *getlogin();
11157c478bd9Sstevel@tonic-gate register struct passwd *pw;
11167c478bd9Sstevel@tonic-gate
11177c478bd9Sstevel@tonic-gate /* cache the result */
11187c478bd9Sstevel@tonic-gate if (myname == NULL)
11197c478bd9Sstevel@tonic-gate {
11207c478bd9Sstevel@tonic-gate myname = getlogin();
11217c478bd9Sstevel@tonic-gate if (myname == NULL || myname[0] == '\0')
11227c478bd9Sstevel@tonic-gate {
11237c478bd9Sstevel@tonic-gate pw = sm_getpwuid(RealUid);
11247c478bd9Sstevel@tonic-gate if (pw != NULL)
11257c478bd9Sstevel@tonic-gate myname = pw->pw_name;
11267c478bd9Sstevel@tonic-gate }
11277c478bd9Sstevel@tonic-gate else
11287c478bd9Sstevel@tonic-gate {
11297c478bd9Sstevel@tonic-gate uid_t uid = RealUid;
11307c478bd9Sstevel@tonic-gate
11317c478bd9Sstevel@tonic-gate if ((pw = sm_getpwnam(myname)) == NULL ||
11327c478bd9Sstevel@tonic-gate (uid != 0 && uid != pw->pw_uid))
11337c478bd9Sstevel@tonic-gate {
11347c478bd9Sstevel@tonic-gate pw = sm_getpwuid(uid);
11357c478bd9Sstevel@tonic-gate if (pw != NULL)
11367c478bd9Sstevel@tonic-gate myname = pw->pw_name;
11377c478bd9Sstevel@tonic-gate }
11387c478bd9Sstevel@tonic-gate }
11397c478bd9Sstevel@tonic-gate if (myname == NULL || myname[0] == '\0')
11407c478bd9Sstevel@tonic-gate {
11417c478bd9Sstevel@tonic-gate syserr("554 5.3.0 Who are you?");
11427c478bd9Sstevel@tonic-gate myname = "postmaster";
11437c478bd9Sstevel@tonic-gate }
11447c478bd9Sstevel@tonic-gate else if (strpbrk(myname, ",;:/|\"\\") != NULL)
11457c478bd9Sstevel@tonic-gate myname = addquotes(myname, NULL);
11467c478bd9Sstevel@tonic-gate else
11477c478bd9Sstevel@tonic-gate myname = sm_pstrdup_x(myname);
11487c478bd9Sstevel@tonic-gate }
11497c478bd9Sstevel@tonic-gate return myname;
11507c478bd9Sstevel@tonic-gate }
11517c478bd9Sstevel@tonic-gate /*
11527c478bd9Sstevel@tonic-gate ** TTYPATH -- Get the path of the user's tty
11537c478bd9Sstevel@tonic-gate **
11547c478bd9Sstevel@tonic-gate ** Returns the pathname of the user's tty. Returns NULL if
11557c478bd9Sstevel@tonic-gate ** the user is not logged in or if s/he has write permission
11567c478bd9Sstevel@tonic-gate ** denied.
11577c478bd9Sstevel@tonic-gate **
11587c478bd9Sstevel@tonic-gate ** Parameters:
11597c478bd9Sstevel@tonic-gate ** none
11607c478bd9Sstevel@tonic-gate **
11617c478bd9Sstevel@tonic-gate ** Returns:
11627c478bd9Sstevel@tonic-gate ** pathname of the user's tty.
11637c478bd9Sstevel@tonic-gate ** NULL if not logged in or write permission denied.
11647c478bd9Sstevel@tonic-gate **
11657c478bd9Sstevel@tonic-gate ** Side Effects:
11667c478bd9Sstevel@tonic-gate ** none.
11677c478bd9Sstevel@tonic-gate **
11687c478bd9Sstevel@tonic-gate ** WARNING:
11697c478bd9Sstevel@tonic-gate ** Return value is in a local buffer.
11707c478bd9Sstevel@tonic-gate **
11717c478bd9Sstevel@tonic-gate ** Called By:
11727c478bd9Sstevel@tonic-gate ** savemail
11737c478bd9Sstevel@tonic-gate */
11747c478bd9Sstevel@tonic-gate
11757c478bd9Sstevel@tonic-gate char *
ttypath()11767c478bd9Sstevel@tonic-gate ttypath()
11777c478bd9Sstevel@tonic-gate {
11787c478bd9Sstevel@tonic-gate struct stat stbuf;
11797c478bd9Sstevel@tonic-gate register char *pathn;
11807c478bd9Sstevel@tonic-gate extern char *ttyname();
11817c478bd9Sstevel@tonic-gate extern char *getlogin();
11827c478bd9Sstevel@tonic-gate
11837c478bd9Sstevel@tonic-gate /* compute the pathname of the controlling tty */
11847c478bd9Sstevel@tonic-gate if ((pathn = ttyname(2)) == NULL && (pathn = ttyname(1)) == NULL &&
11857c478bd9Sstevel@tonic-gate (pathn = ttyname(0)) == NULL)
11867c478bd9Sstevel@tonic-gate {
11877c478bd9Sstevel@tonic-gate errno = 0;
11887c478bd9Sstevel@tonic-gate return NULL;
11897c478bd9Sstevel@tonic-gate }
11907c478bd9Sstevel@tonic-gate
11917c478bd9Sstevel@tonic-gate /* see if we have write permission */
11927c478bd9Sstevel@tonic-gate if (stat(pathn, &stbuf) < 0 || !bitset(S_IWOTH, stbuf.st_mode))
11937c478bd9Sstevel@tonic-gate {
11947c478bd9Sstevel@tonic-gate errno = 0;
11957c478bd9Sstevel@tonic-gate return NULL;
11967c478bd9Sstevel@tonic-gate }
11977c478bd9Sstevel@tonic-gate
11987c478bd9Sstevel@tonic-gate /* see if the user is logged in */
11997c478bd9Sstevel@tonic-gate if (getlogin() == NULL)
12007c478bd9Sstevel@tonic-gate return NULL;
12017c478bd9Sstevel@tonic-gate
12027c478bd9Sstevel@tonic-gate /* looks good */
12037c478bd9Sstevel@tonic-gate return pathn;
12047c478bd9Sstevel@tonic-gate }
12057c478bd9Sstevel@tonic-gate /*
12067c478bd9Sstevel@tonic-gate ** CHECKCOMPAT -- check for From and To person compatible.
12077c478bd9Sstevel@tonic-gate **
12087c478bd9Sstevel@tonic-gate ** This routine can be supplied on a per-installation basis
12097c478bd9Sstevel@tonic-gate ** to determine whether a person is allowed to send a message.
12107c478bd9Sstevel@tonic-gate ** This allows restriction of certain types of internet
12117c478bd9Sstevel@tonic-gate ** forwarding or registration of users.
12127c478bd9Sstevel@tonic-gate **
12137c478bd9Sstevel@tonic-gate ** If the hosts are found to be incompatible, an error
12147c478bd9Sstevel@tonic-gate ** message should be given using "usrerr" and an EX_ code
12157c478bd9Sstevel@tonic-gate ** should be returned. You can also set to->q_status to
12167c478bd9Sstevel@tonic-gate ** a DSN-style status code.
12177c478bd9Sstevel@tonic-gate **
12187c478bd9Sstevel@tonic-gate ** EF_NO_BODY_RETN can be set in e->e_flags to suppress the
12197c478bd9Sstevel@tonic-gate ** body during the return-to-sender function; this should be done
12207c478bd9Sstevel@tonic-gate ** on huge messages. This bit may already be set by the ESMTP
12217c478bd9Sstevel@tonic-gate ** protocol.
12227c478bd9Sstevel@tonic-gate **
12237c478bd9Sstevel@tonic-gate ** Parameters:
12247c478bd9Sstevel@tonic-gate ** to -- the person being sent to.
12257c478bd9Sstevel@tonic-gate **
12267c478bd9Sstevel@tonic-gate ** Returns:
12277c478bd9Sstevel@tonic-gate ** an exit status
12287c478bd9Sstevel@tonic-gate **
12297c478bd9Sstevel@tonic-gate ** Side Effects:
12307c478bd9Sstevel@tonic-gate ** none (unless you include the usrerr stuff)
12317c478bd9Sstevel@tonic-gate */
12327c478bd9Sstevel@tonic-gate
12337c478bd9Sstevel@tonic-gate int
checkcompat(to,e)12347c478bd9Sstevel@tonic-gate checkcompat(to, e)
12357c478bd9Sstevel@tonic-gate register ADDRESS *to;
12367c478bd9Sstevel@tonic-gate register ENVELOPE *e;
12377c478bd9Sstevel@tonic-gate {
12387c478bd9Sstevel@tonic-gate if (tTd(49, 1))
12397c478bd9Sstevel@tonic-gate sm_dprintf("checkcompat(to=%s, from=%s)\n",
12407c478bd9Sstevel@tonic-gate to->q_paddr, e->e_from.q_paddr);
12417c478bd9Sstevel@tonic-gate
12427c478bd9Sstevel@tonic-gate #ifdef EXAMPLE_CODE
12437c478bd9Sstevel@tonic-gate /* this code is intended as an example only */
12447c478bd9Sstevel@tonic-gate register STAB *s;
12457c478bd9Sstevel@tonic-gate
12467c478bd9Sstevel@tonic-gate s = stab("arpa", ST_MAILER, ST_FIND);
12477c478bd9Sstevel@tonic-gate if (s != NULL && strcmp(e->e_from.q_mailer->m_name, "local") != 0 &&
12487c478bd9Sstevel@tonic-gate to->q_mailer == s->s_mailer)
12497c478bd9Sstevel@tonic-gate {
12507c478bd9Sstevel@tonic-gate usrerr("553 No ARPA mail through this machine: see your system administration");
12517c478bd9Sstevel@tonic-gate /* e->e_flags |= EF_NO_BODY_RETN; to suppress body on return */
12527c478bd9Sstevel@tonic-gate to->q_status = "5.7.1";
12537c478bd9Sstevel@tonic-gate return EX_UNAVAILABLE;
12547c478bd9Sstevel@tonic-gate }
12557c478bd9Sstevel@tonic-gate #endif /* EXAMPLE_CODE */
12567c478bd9Sstevel@tonic-gate return EX_OK;
12577c478bd9Sstevel@tonic-gate }
1258d25d47eeSjbeck
1259d25d47eeSjbeck #ifdef SUN_EXTENSIONS
1260d25d47eeSjbeck static void
init_md_sun()1261d25d47eeSjbeck init_md_sun()
1262d25d47eeSjbeck {
1263d25d47eeSjbeck struct stat sbuf;
1264d25d47eeSjbeck
1265d25d47eeSjbeck /* Check for large file descriptor */
1266d25d47eeSjbeck if (fstat(fileno(stdin), &sbuf) < 0)
1267d25d47eeSjbeck {
1268d25d47eeSjbeck if (errno == EOVERFLOW)
1269d25d47eeSjbeck {
1270d25d47eeSjbeck perror("stdin");
1271d25d47eeSjbeck exit(EX_NOINPUT);
1272d25d47eeSjbeck }
1273d25d47eeSjbeck }
1274d25d47eeSjbeck }
1275d25d47eeSjbeck #endif /* SUN_EXTENSIONS */
1276d25d47eeSjbeck
12777c478bd9Sstevel@tonic-gate /*
12787c478bd9Sstevel@tonic-gate ** INIT_MD -- do machine dependent initializations
12797c478bd9Sstevel@tonic-gate **
12807c478bd9Sstevel@tonic-gate ** Systems that have global modes that should be set should do
12817c478bd9Sstevel@tonic-gate ** them here rather than in main.
12827c478bd9Sstevel@tonic-gate */
12837c478bd9Sstevel@tonic-gate
12847c478bd9Sstevel@tonic-gate #ifdef _AUX_SOURCE
12857c478bd9Sstevel@tonic-gate # include <compat.h>
12867c478bd9Sstevel@tonic-gate #endif /* _AUX_SOURCE */
12877c478bd9Sstevel@tonic-gate
12887c478bd9Sstevel@tonic-gate #if SHARE_V1
12897c478bd9Sstevel@tonic-gate # include <shares.h>
12907c478bd9Sstevel@tonic-gate #endif /* SHARE_V1 */
12917c478bd9Sstevel@tonic-gate
12927c478bd9Sstevel@tonic-gate void
init_md(argc,argv)12937c478bd9Sstevel@tonic-gate init_md(argc, argv)
12947c478bd9Sstevel@tonic-gate int argc;
12957c478bd9Sstevel@tonic-gate char **argv;
12967c478bd9Sstevel@tonic-gate {
12977c478bd9Sstevel@tonic-gate #ifdef _AUX_SOURCE
12987c478bd9Sstevel@tonic-gate setcompat(getcompat() | COMPAT_BSDPROT);
12997c478bd9Sstevel@tonic-gate #endif /* _AUX_SOURCE */
13007c478bd9Sstevel@tonic-gate
13017c478bd9Sstevel@tonic-gate #ifdef SUN_EXTENSIONS
13027c478bd9Sstevel@tonic-gate init_md_sun();
13037c478bd9Sstevel@tonic-gate #endif /* SUN_EXTENSIONS */
13047c478bd9Sstevel@tonic-gate
13057c478bd9Sstevel@tonic-gate #if _CONVEX_SOURCE
13067c478bd9Sstevel@tonic-gate /* keep gethostby*() from stripping the local domain name */
13077c478bd9Sstevel@tonic-gate set_domain_trim_off();
13087c478bd9Sstevel@tonic-gate #endif /* _CONVEX_SOURCE */
13094aac33d3Sjbeck #if defined(__QNX__) && !defined(__QNXNTO__)
13107c478bd9Sstevel@tonic-gate /*
13117c478bd9Sstevel@tonic-gate ** Due to QNX's network distributed nature, you can target a tcpip
13127c478bd9Sstevel@tonic-gate ** stack on a different node in the qnx network; this patch lets
13137c478bd9Sstevel@tonic-gate ** this feature work. The __sock_locate() must be done before the
13147c478bd9Sstevel@tonic-gate ** environment is clear.
13157c478bd9Sstevel@tonic-gate */
13167c478bd9Sstevel@tonic-gate __sock_locate();
13177c478bd9Sstevel@tonic-gate #endif /* __QNX__ */
13187c478bd9Sstevel@tonic-gate #if SECUREWARE || defined(_SCO_unix_)
13197c478bd9Sstevel@tonic-gate set_auth_parameters(argc, argv);
13207c478bd9Sstevel@tonic-gate
13217c478bd9Sstevel@tonic-gate # ifdef _SCO_unix_
13227c478bd9Sstevel@tonic-gate /*
13237c478bd9Sstevel@tonic-gate ** This is required for highest security levels (the kernel
13247c478bd9Sstevel@tonic-gate ** won't let it call set*uid() or run setuid binaries without
13257c478bd9Sstevel@tonic-gate ** it). It may be necessary on other SECUREWARE systems.
13267c478bd9Sstevel@tonic-gate */
13277c478bd9Sstevel@tonic-gate
13287c478bd9Sstevel@tonic-gate if (getluid() == -1)
13297c478bd9Sstevel@tonic-gate setluid(0);
13307c478bd9Sstevel@tonic-gate # endif /* _SCO_unix_ */
13317c478bd9Sstevel@tonic-gate #endif /* SECUREWARE || defined(_SCO_unix_) */
13327c478bd9Sstevel@tonic-gate
13337c478bd9Sstevel@tonic-gate
13347c478bd9Sstevel@tonic-gate #ifdef VENDOR_DEFAULT
13357c478bd9Sstevel@tonic-gate VendorCode = VENDOR_DEFAULT;
13367c478bd9Sstevel@tonic-gate #else /* VENDOR_DEFAULT */
13377c478bd9Sstevel@tonic-gate VendorCode = VENDOR_BERKELEY;
13387c478bd9Sstevel@tonic-gate #endif /* VENDOR_DEFAULT */
13397c478bd9Sstevel@tonic-gate }
13407c478bd9Sstevel@tonic-gate /*
13417c478bd9Sstevel@tonic-gate ** INIT_VENDOR_MACROS -- vendor-dependent macro initializations
13427c478bd9Sstevel@tonic-gate **
13437c478bd9Sstevel@tonic-gate ** Called once, on startup.
13447c478bd9Sstevel@tonic-gate **
13457c478bd9Sstevel@tonic-gate ** Parameters:
13467c478bd9Sstevel@tonic-gate ** e -- the global envelope.
13477c478bd9Sstevel@tonic-gate **
13487c478bd9Sstevel@tonic-gate ** Returns:
13497c478bd9Sstevel@tonic-gate ** none.
13507c478bd9Sstevel@tonic-gate **
13517c478bd9Sstevel@tonic-gate ** Side Effects:
13527c478bd9Sstevel@tonic-gate ** vendor-dependent.
13537c478bd9Sstevel@tonic-gate */
13547c478bd9Sstevel@tonic-gate
13557c478bd9Sstevel@tonic-gate void
init_vendor_macros(e)13567c478bd9Sstevel@tonic-gate init_vendor_macros(e)
13577c478bd9Sstevel@tonic-gate register ENVELOPE *e;
13587c478bd9Sstevel@tonic-gate {
13597c478bd9Sstevel@tonic-gate }
13607c478bd9Sstevel@tonic-gate /*
13617c478bd9Sstevel@tonic-gate ** GETLA -- get the current load average
13627c478bd9Sstevel@tonic-gate **
13637c478bd9Sstevel@tonic-gate ** This code stolen from la.c.
13647c478bd9Sstevel@tonic-gate **
13657c478bd9Sstevel@tonic-gate ** Parameters:
13667c478bd9Sstevel@tonic-gate ** none.
13677c478bd9Sstevel@tonic-gate **
13687c478bd9Sstevel@tonic-gate ** Returns:
13697c478bd9Sstevel@tonic-gate ** The current load average as an integer.
13707c478bd9Sstevel@tonic-gate **
13717c478bd9Sstevel@tonic-gate ** Side Effects:
13727c478bd9Sstevel@tonic-gate ** none.
13737c478bd9Sstevel@tonic-gate */
13747c478bd9Sstevel@tonic-gate
13757c478bd9Sstevel@tonic-gate /* try to guess what style of load average we have */
13767c478bd9Sstevel@tonic-gate #define LA_ZERO 1 /* always return load average as zero */
13777c478bd9Sstevel@tonic-gate #define LA_INT 2 /* read kmem for avenrun; interpret as long */
13787c478bd9Sstevel@tonic-gate #define LA_FLOAT 3 /* read kmem for avenrun; interpret as float */
13797c478bd9Sstevel@tonic-gate #define LA_SUBR 4 /* call getloadavg */
13807c478bd9Sstevel@tonic-gate #define LA_MACH 5 /* MACH load averages (as on NeXT boxes) */
13817c478bd9Sstevel@tonic-gate #define LA_SHORT 6 /* read kmem for avenrun; interpret as short */
13827c478bd9Sstevel@tonic-gate #define LA_PROCSTR 7 /* read string ("1.17") from /proc/loadavg */
13837c478bd9Sstevel@tonic-gate #define LA_READKSYM 8 /* SVR4: use MIOC_READKSYM ioctl call */
13847c478bd9Sstevel@tonic-gate #define LA_DGUX 9 /* special DGUX implementation */
13857c478bd9Sstevel@tonic-gate #define LA_HPUX 10 /* special HPUX implementation */
13867c478bd9Sstevel@tonic-gate #define LA_IRIX6 11 /* special IRIX 6.2 implementation */
13877c478bd9Sstevel@tonic-gate #define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */
13887c478bd9Sstevel@tonic-gate #define LA_DEVSHORT 13 /* read short from a device */
13897c478bd9Sstevel@tonic-gate #define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */
13907c478bd9Sstevel@tonic-gate #define LA_PSET 15 /* Solaris per-processor-set load average */
13917c478bd9Sstevel@tonic-gate #define LA_LONGLONG 17 /* read kmem for avenrun; interpret as long long */
13927c478bd9Sstevel@tonic-gate
13937c478bd9Sstevel@tonic-gate /* do guesses based on general OS type */
13947c478bd9Sstevel@tonic-gate #ifndef LA_TYPE
13957c478bd9Sstevel@tonic-gate # define LA_TYPE LA_ZERO
13967c478bd9Sstevel@tonic-gate #endif /* ! LA_TYPE */
13977c478bd9Sstevel@tonic-gate
13987c478bd9Sstevel@tonic-gate #ifndef FSHIFT
13997c478bd9Sstevel@tonic-gate # if defined(unixpc)
14007c478bd9Sstevel@tonic-gate # define FSHIFT 5
14017c478bd9Sstevel@tonic-gate # endif /* defined(unixpc) */
14027c478bd9Sstevel@tonic-gate
14037c478bd9Sstevel@tonic-gate # if defined(__alpha) || defined(IRIX)
14047c478bd9Sstevel@tonic-gate # define FSHIFT 10
14057c478bd9Sstevel@tonic-gate # endif /* defined(__alpha) || defined(IRIX) */
14067c478bd9Sstevel@tonic-gate
14077c478bd9Sstevel@tonic-gate #endif /* ! FSHIFT */
14087c478bd9Sstevel@tonic-gate
14097c478bd9Sstevel@tonic-gate #ifndef FSHIFT
14107c478bd9Sstevel@tonic-gate # define FSHIFT 8
14117c478bd9Sstevel@tonic-gate #endif /* ! FSHIFT */
14127c478bd9Sstevel@tonic-gate
14137c478bd9Sstevel@tonic-gate #ifndef FSCALE
14147c478bd9Sstevel@tonic-gate # define FSCALE (1 << FSHIFT)
14157c478bd9Sstevel@tonic-gate #endif /* ! FSCALE */
14167c478bd9Sstevel@tonic-gate
14177c478bd9Sstevel@tonic-gate #ifndef LA_AVENRUN
14187c478bd9Sstevel@tonic-gate # ifdef SYSTEM5
14197c478bd9Sstevel@tonic-gate # define LA_AVENRUN "avenrun"
14207c478bd9Sstevel@tonic-gate # else /* SYSTEM5 */
14217c478bd9Sstevel@tonic-gate # define LA_AVENRUN "_avenrun"
14227c478bd9Sstevel@tonic-gate # endif /* SYSTEM5 */
14237c478bd9Sstevel@tonic-gate #endif /* ! LA_AVENRUN */
14247c478bd9Sstevel@tonic-gate
14257c478bd9Sstevel@tonic-gate /* _PATH_KMEM should be defined in <paths.h> */
14267c478bd9Sstevel@tonic-gate #ifndef _PATH_KMEM
14277c478bd9Sstevel@tonic-gate # define _PATH_KMEM "/dev/kmem"
14287c478bd9Sstevel@tonic-gate #endif /* ! _PATH_KMEM */
14297c478bd9Sstevel@tonic-gate
14307c478bd9Sstevel@tonic-gate #if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG)
14317c478bd9Sstevel@tonic-gate
14327c478bd9Sstevel@tonic-gate # include <nlist.h>
14337c478bd9Sstevel@tonic-gate
14347c478bd9Sstevel@tonic-gate /* _PATH_UNIX should be defined in <paths.h> */
14357c478bd9Sstevel@tonic-gate # ifndef _PATH_UNIX
14367c478bd9Sstevel@tonic-gate # if defined(SYSTEM5)
14377c478bd9Sstevel@tonic-gate # define _PATH_UNIX "/unix"
14387c478bd9Sstevel@tonic-gate # else /* defined(SYSTEM5) */
14397c478bd9Sstevel@tonic-gate # define _PATH_UNIX "/vmunix"
14407c478bd9Sstevel@tonic-gate # endif /* defined(SYSTEM5) */
14417c478bd9Sstevel@tonic-gate # endif /* ! _PATH_UNIX */
14427c478bd9Sstevel@tonic-gate
14437c478bd9Sstevel@tonic-gate # ifdef _AUX_SOURCE
14447c478bd9Sstevel@tonic-gate struct nlist Nl[2];
14457c478bd9Sstevel@tonic-gate # else /* _AUX_SOURCE */
14467c478bd9Sstevel@tonic-gate struct nlist Nl[] =
14477c478bd9Sstevel@tonic-gate {
14487c478bd9Sstevel@tonic-gate { LA_AVENRUN },
14497c478bd9Sstevel@tonic-gate { 0 },
14507c478bd9Sstevel@tonic-gate };
14517c478bd9Sstevel@tonic-gate # endif /* _AUX_SOURCE */
14527c478bd9Sstevel@tonic-gate # define X_AVENRUN 0
14537c478bd9Sstevel@tonic-gate
14547c478bd9Sstevel@tonic-gate int
getla()14557c478bd9Sstevel@tonic-gate getla()
14567c478bd9Sstevel@tonic-gate {
14577c478bd9Sstevel@tonic-gate int j;
14587c478bd9Sstevel@tonic-gate static int kmem = -1;
14597c478bd9Sstevel@tonic-gate # if LA_TYPE == LA_INT
14607c478bd9Sstevel@tonic-gate long avenrun[3];
14617c478bd9Sstevel@tonic-gate # else /* LA_TYPE == LA_INT */
14627c478bd9Sstevel@tonic-gate # if LA_TYPE == LA_SHORT
14637c478bd9Sstevel@tonic-gate short avenrun[3];
14647c478bd9Sstevel@tonic-gate # else
14657c478bd9Sstevel@tonic-gate # if LA_TYPE == LA_LONGLONG
14667c478bd9Sstevel@tonic-gate long long avenrun[3];
14677c478bd9Sstevel@tonic-gate # else /* LA_TYPE == LA_LONGLONG */
14687c478bd9Sstevel@tonic-gate double avenrun[3];
14697c478bd9Sstevel@tonic-gate # endif /* LA_TYPE == LA_LONGLONG */
14707c478bd9Sstevel@tonic-gate # endif /* LA_TYPE == LA_SHORT */
14717c478bd9Sstevel@tonic-gate # endif /* LA_TYPE == LA_INT */
14727c478bd9Sstevel@tonic-gate extern off_t lseek();
14737c478bd9Sstevel@tonic-gate
14747c478bd9Sstevel@tonic-gate if (kmem < 0)
14757c478bd9Sstevel@tonic-gate {
14767c478bd9Sstevel@tonic-gate # ifdef _AUX_SOURCE
14777c478bd9Sstevel@tonic-gate (void) sm_strlcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN,
1478058561cbSjbeck sizeof(Nl[X_AVENRUN].n_name));
14797c478bd9Sstevel@tonic-gate Nl[1].n_name[0] = '\0';
14807c478bd9Sstevel@tonic-gate # endif /* _AUX_SOURCE */
14817c478bd9Sstevel@tonic-gate
14827c478bd9Sstevel@tonic-gate # if defined(_AIX3) || defined(_AIX4)
1483058561cbSjbeck if (knlist(Nl, 1, sizeof(Nl[0])) < 0)
14847c478bd9Sstevel@tonic-gate # else /* defined(_AIX3) || defined(_AIX4) */
14857c478bd9Sstevel@tonic-gate if (nlist(_PATH_UNIX, Nl) < 0)
14867c478bd9Sstevel@tonic-gate # endif /* defined(_AIX3) || defined(_AIX4) */
14877c478bd9Sstevel@tonic-gate {
14887c478bd9Sstevel@tonic-gate if (tTd(3, 1))
14897c478bd9Sstevel@tonic-gate sm_dprintf("getla: nlist(%s): %s\n", _PATH_UNIX,
14907c478bd9Sstevel@tonic-gate sm_errstring(errno));
14917c478bd9Sstevel@tonic-gate return -1;
14927c478bd9Sstevel@tonic-gate }
14937c478bd9Sstevel@tonic-gate if (Nl[X_AVENRUN].n_value == 0)
14947c478bd9Sstevel@tonic-gate {
14957c478bd9Sstevel@tonic-gate if (tTd(3, 1))
14967c478bd9Sstevel@tonic-gate sm_dprintf("getla: nlist(%s, %s) ==> 0\n",
14977c478bd9Sstevel@tonic-gate _PATH_UNIX, LA_AVENRUN);
14987c478bd9Sstevel@tonic-gate return -1;
14997c478bd9Sstevel@tonic-gate }
15007c478bd9Sstevel@tonic-gate # ifdef NAMELISTMASK
15017c478bd9Sstevel@tonic-gate Nl[X_AVENRUN].n_value &= NAMELISTMASK;
15027c478bd9Sstevel@tonic-gate # endif /* NAMELISTMASK */
15037c478bd9Sstevel@tonic-gate
15047c478bd9Sstevel@tonic-gate kmem = open(_PATH_KMEM, 0, 0);
15057c478bd9Sstevel@tonic-gate if (kmem < 0)
15067c478bd9Sstevel@tonic-gate {
15077c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15087c478bd9Sstevel@tonic-gate sm_dprintf("getla: open(/dev/kmem): %s\n",
15097c478bd9Sstevel@tonic-gate sm_errstring(errno));
15107c478bd9Sstevel@tonic-gate return -1;
15117c478bd9Sstevel@tonic-gate }
15127c478bd9Sstevel@tonic-gate if ((j = fcntl(kmem, F_GETFD, 0)) < 0 ||
15137c478bd9Sstevel@tonic-gate fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0)
15147c478bd9Sstevel@tonic-gate {
15157c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15167c478bd9Sstevel@tonic-gate sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n",
15177c478bd9Sstevel@tonic-gate sm_errstring(errno));
15187c478bd9Sstevel@tonic-gate (void) close(kmem);
15197c478bd9Sstevel@tonic-gate kmem = -1;
15207c478bd9Sstevel@tonic-gate return -1;
15217c478bd9Sstevel@tonic-gate }
15227c478bd9Sstevel@tonic-gate }
15237c478bd9Sstevel@tonic-gate if (tTd(3, 20))
15247c478bd9Sstevel@tonic-gate sm_dprintf("getla: symbol address = %#lx\n",
15257c478bd9Sstevel@tonic-gate (unsigned long) Nl[X_AVENRUN].n_value);
15267c478bd9Sstevel@tonic-gate if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 ||
1527d4660949Sjbeck read(kmem, (char *) avenrun, sizeof(avenrun)) != sizeof(avenrun))
15287c478bd9Sstevel@tonic-gate {
15297c478bd9Sstevel@tonic-gate /* thank you Ian */
15307c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15317c478bd9Sstevel@tonic-gate sm_dprintf("getla: lseek or read: %s\n",
15327c478bd9Sstevel@tonic-gate sm_errstring(errno));
15337c478bd9Sstevel@tonic-gate return -1;
15347c478bd9Sstevel@tonic-gate }
15357c478bd9Sstevel@tonic-gate # if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG)
15367c478bd9Sstevel@tonic-gate if (tTd(3, 5))
15377c478bd9Sstevel@tonic-gate {
15387c478bd9Sstevel@tonic-gate # if LA_TYPE == LA_SHORT
15397c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %d", avenrun[0]);
15407c478bd9Sstevel@tonic-gate if (tTd(3, 15))
15417c478bd9Sstevel@tonic-gate sm_dprintf(", %d, %d", avenrun[1], avenrun[2]);
15427c478bd9Sstevel@tonic-gate # else /* LA_TYPE == LA_SHORT */
15437c478bd9Sstevel@tonic-gate # if LA_TYPE == LA_LONGLONG
15447c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %lld", avenrun[0]);
15457c478bd9Sstevel@tonic-gate if (tTd(3, 15))
15467c478bd9Sstevel@tonic-gate sm_dprintf(", %lld, %lld", avenrun[1], avenrun[2]);
15477c478bd9Sstevel@tonic-gate # else /* LA_TYPE == LA_LONGLONG */
15487c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %ld", avenrun[0]);
15497c478bd9Sstevel@tonic-gate if (tTd(3, 15))
15507c478bd9Sstevel@tonic-gate sm_dprintf(", %ld, %ld", avenrun[1], avenrun[2]);
15517c478bd9Sstevel@tonic-gate # endif /* LA_TYPE == LA_LONGLONG */
15527c478bd9Sstevel@tonic-gate # endif /* LA_TYPE == LA_SHORT */
15537c478bd9Sstevel@tonic-gate sm_dprintf("\n");
15547c478bd9Sstevel@tonic-gate }
15557c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15567c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n",
15577c478bd9Sstevel@tonic-gate (int) (avenrun[0] + FSCALE/2) >> FSHIFT);
15587c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
15597c478bd9Sstevel@tonic-gate # else /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */
15607c478bd9Sstevel@tonic-gate if (tTd(3, 5))
15617c478bd9Sstevel@tonic-gate {
15627c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %g", avenrun[0]);
15637c478bd9Sstevel@tonic-gate if (tTd(3, 15))
15647c478bd9Sstevel@tonic-gate sm_dprintf(", %g, %g", avenrun[1], avenrun[2]);
15657c478bd9Sstevel@tonic-gate sm_dprintf("\n");
15667c478bd9Sstevel@tonic-gate }
15677c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15687c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5));
15697c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + 0.5));
15707c478bd9Sstevel@tonic-gate # endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */
15717c478bd9Sstevel@tonic-gate }
15727c478bd9Sstevel@tonic-gate
15737c478bd9Sstevel@tonic-gate #endif /* (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) || (LA_TYPE == LA_LONGLONG) */
15747c478bd9Sstevel@tonic-gate
15757c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_READKSYM
15767c478bd9Sstevel@tonic-gate
15777c478bd9Sstevel@tonic-gate # include <sys/ksym.h>
15787c478bd9Sstevel@tonic-gate
15797c478bd9Sstevel@tonic-gate int
getla()15807c478bd9Sstevel@tonic-gate getla()
15817c478bd9Sstevel@tonic-gate {
15827c478bd9Sstevel@tonic-gate int j;
15837c478bd9Sstevel@tonic-gate static int kmem = -1;
15847c478bd9Sstevel@tonic-gate long avenrun[3];
15857c478bd9Sstevel@tonic-gate struct mioc_rksym mirk;
15867c478bd9Sstevel@tonic-gate
15877c478bd9Sstevel@tonic-gate if (kmem < 0)
15887c478bd9Sstevel@tonic-gate {
15897c478bd9Sstevel@tonic-gate kmem = open("/dev/kmem", 0, 0);
15907c478bd9Sstevel@tonic-gate if (kmem < 0)
15917c478bd9Sstevel@tonic-gate {
15927c478bd9Sstevel@tonic-gate if (tTd(3, 1))
15937c478bd9Sstevel@tonic-gate sm_dprintf("getla: open(/dev/kmem): %s\n",
15947c478bd9Sstevel@tonic-gate sm_errstring(errno));
15957c478bd9Sstevel@tonic-gate return -1;
15967c478bd9Sstevel@tonic-gate }
15977c478bd9Sstevel@tonic-gate if ((j = fcntl(kmem, F_GETFD, 0)) < 0 ||
15987c478bd9Sstevel@tonic-gate fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0)
15997c478bd9Sstevel@tonic-gate {
16007c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16017c478bd9Sstevel@tonic-gate sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n",
16027c478bd9Sstevel@tonic-gate sm_errstring(errno));
16037c478bd9Sstevel@tonic-gate (void) close(kmem);
16047c478bd9Sstevel@tonic-gate kmem = -1;
16057c478bd9Sstevel@tonic-gate return -1;
16067c478bd9Sstevel@tonic-gate }
16077c478bd9Sstevel@tonic-gate }
16087c478bd9Sstevel@tonic-gate mirk.mirk_symname = LA_AVENRUN;
16097c478bd9Sstevel@tonic-gate mirk.mirk_buf = avenrun;
16107c478bd9Sstevel@tonic-gate mirk.mirk_buflen = sizeof(avenrun);
16117c478bd9Sstevel@tonic-gate if (ioctl(kmem, MIOC_READKSYM, &mirk) < 0)
16127c478bd9Sstevel@tonic-gate {
16137c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16147c478bd9Sstevel@tonic-gate sm_dprintf("getla: ioctl(MIOC_READKSYM) failed: %s\n",
16157c478bd9Sstevel@tonic-gate sm_errstring(errno));
16167c478bd9Sstevel@tonic-gate return -1;
16177c478bd9Sstevel@tonic-gate }
16187c478bd9Sstevel@tonic-gate if (tTd(3, 5))
16197c478bd9Sstevel@tonic-gate {
16207c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %d", avenrun[0]);
16217c478bd9Sstevel@tonic-gate if (tTd(3, 15))
16227c478bd9Sstevel@tonic-gate sm_dprintf(", %d, %d", avenrun[1], avenrun[2]);
16237c478bd9Sstevel@tonic-gate sm_dprintf("\n");
16247c478bd9Sstevel@tonic-gate }
16257c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16267c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n",
16277c478bd9Sstevel@tonic-gate (int) (avenrun[0] + FSCALE/2) >> FSHIFT);
16287c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
16297c478bd9Sstevel@tonic-gate }
16307c478bd9Sstevel@tonic-gate
16317c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_READKSYM */
16327c478bd9Sstevel@tonic-gate
16337c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_DGUX
16347c478bd9Sstevel@tonic-gate
16357c478bd9Sstevel@tonic-gate # include <sys/dg_sys_info.h>
16367c478bd9Sstevel@tonic-gate
16377c478bd9Sstevel@tonic-gate int
getla()16387c478bd9Sstevel@tonic-gate getla()
16397c478bd9Sstevel@tonic-gate {
16407c478bd9Sstevel@tonic-gate struct dg_sys_info_load_info load_info;
16417c478bd9Sstevel@tonic-gate
16427c478bd9Sstevel@tonic-gate dg_sys_info((long *)&load_info,
16437c478bd9Sstevel@tonic-gate DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0);
16447c478bd9Sstevel@tonic-gate
16457c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16467c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", (int) (load_info.one_minute + 0.5));
16477c478bd9Sstevel@tonic-gate
16487c478bd9Sstevel@tonic-gate return ((int) (load_info.one_minute + 0.5));
16497c478bd9Sstevel@tonic-gate }
16507c478bd9Sstevel@tonic-gate
16517c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_DGUX */
16527c478bd9Sstevel@tonic-gate
16537c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_HPUX
16547c478bd9Sstevel@tonic-gate
16557c478bd9Sstevel@tonic-gate /* forward declarations to keep gcc from complaining */
16567c478bd9Sstevel@tonic-gate struct pst_dynamic;
16577c478bd9Sstevel@tonic-gate struct pst_status;
16587c478bd9Sstevel@tonic-gate struct pst_static;
16597c478bd9Sstevel@tonic-gate struct pst_vminfo;
16607c478bd9Sstevel@tonic-gate struct pst_diskinfo;
16617c478bd9Sstevel@tonic-gate struct pst_processor;
16627c478bd9Sstevel@tonic-gate struct pst_lv;
16637c478bd9Sstevel@tonic-gate struct pst_swapinfo;
16647c478bd9Sstevel@tonic-gate
16657c478bd9Sstevel@tonic-gate # include <sys/param.h>
16667c478bd9Sstevel@tonic-gate # include <sys/pstat.h>
16677c478bd9Sstevel@tonic-gate
16687c478bd9Sstevel@tonic-gate int
getla()16697c478bd9Sstevel@tonic-gate getla()
16707c478bd9Sstevel@tonic-gate {
16717c478bd9Sstevel@tonic-gate struct pst_dynamic pstd;
16727c478bd9Sstevel@tonic-gate
16737c478bd9Sstevel@tonic-gate if (pstat_getdynamic(&pstd, sizeof(struct pst_dynamic),
16747c478bd9Sstevel@tonic-gate (size_t) 1, 0) == -1)
16757c478bd9Sstevel@tonic-gate return 0;
16767c478bd9Sstevel@tonic-gate
16777c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16787c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", (int) (pstd.psd_avg_1_min + 0.5));
16797c478bd9Sstevel@tonic-gate
16807c478bd9Sstevel@tonic-gate return (int) (pstd.psd_avg_1_min + 0.5);
16817c478bd9Sstevel@tonic-gate }
16827c478bd9Sstevel@tonic-gate
16837c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_HPUX */
16847c478bd9Sstevel@tonic-gate
16857c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_SUBR
16867c478bd9Sstevel@tonic-gate
16877c478bd9Sstevel@tonic-gate int
getla()16887c478bd9Sstevel@tonic-gate getla()
16897c478bd9Sstevel@tonic-gate {
16907c478bd9Sstevel@tonic-gate double avenrun[3];
16917c478bd9Sstevel@tonic-gate
16927c478bd9Sstevel@tonic-gate if (getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0])) < 0)
16937c478bd9Sstevel@tonic-gate {
16947c478bd9Sstevel@tonic-gate if (tTd(3, 1))
16957c478bd9Sstevel@tonic-gate sm_dprintf("getla: getloadavg failed: %s",
16967c478bd9Sstevel@tonic-gate sm_errstring(errno));
16977c478bd9Sstevel@tonic-gate return -1;
16987c478bd9Sstevel@tonic-gate }
16997c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17007c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5));
17017c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + 0.5));
17027c478bd9Sstevel@tonic-gate }
17037c478bd9Sstevel@tonic-gate
17047c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_SUBR */
17057c478bd9Sstevel@tonic-gate
17067c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_MACH
17077c478bd9Sstevel@tonic-gate
17087c478bd9Sstevel@tonic-gate /*
17097c478bd9Sstevel@tonic-gate ** This has been tested on NEXTSTEP release 2.1/3.X.
17107c478bd9Sstevel@tonic-gate */
17117c478bd9Sstevel@tonic-gate
17127c478bd9Sstevel@tonic-gate # if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0
17137c478bd9Sstevel@tonic-gate # include <mach/mach.h>
17147c478bd9Sstevel@tonic-gate # else /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */
17157c478bd9Sstevel@tonic-gate # include <mach.h>
17167c478bd9Sstevel@tonic-gate # endif /* defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 */
17177c478bd9Sstevel@tonic-gate
17187c478bd9Sstevel@tonic-gate int
getla()17197c478bd9Sstevel@tonic-gate getla()
17207c478bd9Sstevel@tonic-gate {
17217c478bd9Sstevel@tonic-gate processor_set_t default_set;
17227c478bd9Sstevel@tonic-gate kern_return_t error;
17237c478bd9Sstevel@tonic-gate unsigned int info_count;
17247c478bd9Sstevel@tonic-gate struct processor_set_basic_info info;
17257c478bd9Sstevel@tonic-gate host_t host;
17267c478bd9Sstevel@tonic-gate
17277c478bd9Sstevel@tonic-gate error = processor_set_default(host_self(), &default_set);
17287c478bd9Sstevel@tonic-gate if (error != KERN_SUCCESS)
17297c478bd9Sstevel@tonic-gate {
17307c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17317c478bd9Sstevel@tonic-gate sm_dprintf("getla: processor_set_default failed: %s",
17327c478bd9Sstevel@tonic-gate sm_errstring(errno));
17337c478bd9Sstevel@tonic-gate return -1;
17347c478bd9Sstevel@tonic-gate }
17357c478bd9Sstevel@tonic-gate info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
17367c478bd9Sstevel@tonic-gate if (processor_set_info(default_set, PROCESSOR_SET_BASIC_INFO,
17377c478bd9Sstevel@tonic-gate &host, (processor_set_info_t)&info,
17387c478bd9Sstevel@tonic-gate &info_count) != KERN_SUCCESS)
17397c478bd9Sstevel@tonic-gate {
17407c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17417c478bd9Sstevel@tonic-gate sm_dprintf("getla: processor_set_info failed: %s",
17427c478bd9Sstevel@tonic-gate sm_errstring(errno));
17437c478bd9Sstevel@tonic-gate return -1;
17447c478bd9Sstevel@tonic-gate }
17457c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17467c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n",
17477c478bd9Sstevel@tonic-gate (int) ((info.load_average + (LOAD_SCALE / 2)) /
17487c478bd9Sstevel@tonic-gate LOAD_SCALE));
17497c478bd9Sstevel@tonic-gate return (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE;
17507c478bd9Sstevel@tonic-gate }
17517c478bd9Sstevel@tonic-gate
17527c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_MACH */
17537c478bd9Sstevel@tonic-gate
17547c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_PROCSTR
17557c478bd9Sstevel@tonic-gate # if SM_CONF_BROKEN_STRTOD
17567c478bd9Sstevel@tonic-gate ERROR: This OS has most likely a broken strtod() implemenentation.
17577c478bd9Sstevel@tonic-gate ERROR: The function is required for getla().
17587c478bd9Sstevel@tonic-gate ERROR: Check the compilation options _LA_PROCSTR and
_SM_CONF_BROKEN_STRTOD(without the leading _)17597c478bd9Sstevel@tonic-gate ERROR: _SM_CONF_BROKEN_STRTOD (without the leading _).
17607c478bd9Sstevel@tonic-gate # endif /* SM_CONF_BROKEN_STRTOD */
17617c478bd9Sstevel@tonic-gate
17627c478bd9Sstevel@tonic-gate /*
17637c478bd9Sstevel@tonic-gate ** Read /proc/loadavg for the load average. This is assumed to be
17647c478bd9Sstevel@tonic-gate ** in a format like "0.15 0.12 0.06".
17657c478bd9Sstevel@tonic-gate **
17667c478bd9Sstevel@tonic-gate ** Initially intended for Linux. This has been in the kernel
17677c478bd9Sstevel@tonic-gate ** since at least 0.99.15.
17687c478bd9Sstevel@tonic-gate */
17697c478bd9Sstevel@tonic-gate
17707c478bd9Sstevel@tonic-gate # ifndef _PATH_LOADAVG
17717c478bd9Sstevel@tonic-gate # define _PATH_LOADAVG "/proc/loadavg"
17727c478bd9Sstevel@tonic-gate # endif /* ! _PATH_LOADAVG */
17737c478bd9Sstevel@tonic-gate
17747c478bd9Sstevel@tonic-gate int
17757c478bd9Sstevel@tonic-gate getla()
17767c478bd9Sstevel@tonic-gate {
17777c478bd9Sstevel@tonic-gate double avenrun;
17787c478bd9Sstevel@tonic-gate register int result;
17797c478bd9Sstevel@tonic-gate SM_FILE_T *fp;
17807c478bd9Sstevel@tonic-gate
17817c478bd9Sstevel@tonic-gate fp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_LOADAVG, SM_IO_RDONLY,
17827c478bd9Sstevel@tonic-gate NULL);
17837c478bd9Sstevel@tonic-gate if (fp == NULL)
17847c478bd9Sstevel@tonic-gate {
17857c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17867c478bd9Sstevel@tonic-gate sm_dprintf("getla: sm_io_open(%s): %s\n",
17877c478bd9Sstevel@tonic-gate _PATH_LOADAVG, sm_errstring(errno));
17887c478bd9Sstevel@tonic-gate return -1;
17897c478bd9Sstevel@tonic-gate }
17907c478bd9Sstevel@tonic-gate result = sm_io_fscanf(fp, SM_TIME_DEFAULT, "%lf", &avenrun);
17917c478bd9Sstevel@tonic-gate (void) sm_io_close(fp, SM_TIME_DEFAULT);
17927c478bd9Sstevel@tonic-gate if (result != 1)
17937c478bd9Sstevel@tonic-gate {
17947c478bd9Sstevel@tonic-gate if (tTd(3, 1))
17957c478bd9Sstevel@tonic-gate sm_dprintf("getla: sm_io_fscanf() = %d: %s\n",
17967c478bd9Sstevel@tonic-gate result, sm_errstring(errno));
17977c478bd9Sstevel@tonic-gate return -1;
17987c478bd9Sstevel@tonic-gate }
17997c478bd9Sstevel@tonic-gate
18007c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18017c478bd9Sstevel@tonic-gate sm_dprintf("getla(): %.2f\n", avenrun);
18027c478bd9Sstevel@tonic-gate
18037c478bd9Sstevel@tonic-gate return ((int) (avenrun + 0.5));
18047c478bd9Sstevel@tonic-gate }
18057c478bd9Sstevel@tonic-gate
18067c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_PROCSTR */
18077c478bd9Sstevel@tonic-gate
18087c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_IRIX6
18097c478bd9Sstevel@tonic-gate
18107c478bd9Sstevel@tonic-gate # include <sys/sysmp.h>
18117c478bd9Sstevel@tonic-gate
18127c478bd9Sstevel@tonic-gate # ifdef _UNICOSMP
18137c478bd9Sstevel@tonic-gate # define CAST_SYSMP(x) (x)
18147c478bd9Sstevel@tonic-gate # else /* _UNICOSMP */
18157c478bd9Sstevel@tonic-gate # define CAST_SYSMP(x) ((x) & 0x7fffffff)
18167c478bd9Sstevel@tonic-gate # endif /* _UNICOSMP */
18177c478bd9Sstevel@tonic-gate
18187c478bd9Sstevel@tonic-gate int
getla(void)18197c478bd9Sstevel@tonic-gate getla(void)
18207c478bd9Sstevel@tonic-gate {
18217c478bd9Sstevel@tonic-gate int j;
18227c478bd9Sstevel@tonic-gate static int kmem = -1;
18237c478bd9Sstevel@tonic-gate int avenrun[3];
18247c478bd9Sstevel@tonic-gate
18257c478bd9Sstevel@tonic-gate if (kmem < 0)
18267c478bd9Sstevel@tonic-gate {
18277c478bd9Sstevel@tonic-gate kmem = open(_PATH_KMEM, 0, 0);
18287c478bd9Sstevel@tonic-gate if (kmem < 0)
18297c478bd9Sstevel@tonic-gate {
18307c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18317c478bd9Sstevel@tonic-gate sm_dprintf("getla: open(%s): %s\n", _PATH_KMEM,
18327c478bd9Sstevel@tonic-gate sm_errstring(errno));
18337c478bd9Sstevel@tonic-gate return -1;
18347c478bd9Sstevel@tonic-gate }
18357c478bd9Sstevel@tonic-gate if ((j = fcntl(kmem, F_GETFD, 0)) < 0 ||
18367c478bd9Sstevel@tonic-gate fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0)
18377c478bd9Sstevel@tonic-gate {
18387c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18397c478bd9Sstevel@tonic-gate sm_dprintf("getla: fcntl(/dev/kmem, FD_CLOEXEC): %s\n",
18407c478bd9Sstevel@tonic-gate sm_errstring(errno));
18417c478bd9Sstevel@tonic-gate (void) close(kmem);
18427c478bd9Sstevel@tonic-gate kmem = -1;
18437c478bd9Sstevel@tonic-gate return -1;
18447c478bd9Sstevel@tonic-gate }
18457c478bd9Sstevel@tonic-gate }
18467c478bd9Sstevel@tonic-gate
18477c478bd9Sstevel@tonic-gate if (lseek(kmem, CAST_SYSMP(sysmp(MP_KERNADDR, MPKA_AVENRUN)), SEEK_SET)
18487c478bd9Sstevel@tonic-gate == -1 ||
1849d4660949Sjbeck read(kmem, (char *) avenrun, sizeof(avenrun)) != sizeof(avenrun))
18507c478bd9Sstevel@tonic-gate {
18517c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18527c478bd9Sstevel@tonic-gate sm_dprintf("getla: lseek or read: %s\n",
18537c478bd9Sstevel@tonic-gate sm_errstring(errno));
18547c478bd9Sstevel@tonic-gate return -1;
18557c478bd9Sstevel@tonic-gate }
18567c478bd9Sstevel@tonic-gate if (tTd(3, 5))
18577c478bd9Sstevel@tonic-gate {
18587c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %ld", (long int) avenrun[0]);
18597c478bd9Sstevel@tonic-gate if (tTd(3, 15))
18607c478bd9Sstevel@tonic-gate sm_dprintf(", %ld, %ld",
18617c478bd9Sstevel@tonic-gate (long int) avenrun[1], (long int) avenrun[2]);
18627c478bd9Sstevel@tonic-gate sm_dprintf("\n");
18637c478bd9Sstevel@tonic-gate }
18647c478bd9Sstevel@tonic-gate
18657c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18667c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n",
18677c478bd9Sstevel@tonic-gate (int) (avenrun[0] + FSCALE/2) >> FSHIFT);
18687c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT);
18697c478bd9Sstevel@tonic-gate
18707c478bd9Sstevel@tonic-gate }
18717c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_IRIX6 */
18727c478bd9Sstevel@tonic-gate
18737c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_KSTAT
18747c478bd9Sstevel@tonic-gate
18757c478bd9Sstevel@tonic-gate # include <kstat.h>
18767c478bd9Sstevel@tonic-gate
18777c478bd9Sstevel@tonic-gate int
getla()18787c478bd9Sstevel@tonic-gate getla()
18797c478bd9Sstevel@tonic-gate {
18807c478bd9Sstevel@tonic-gate static kstat_ctl_t *kc = NULL;
18817c478bd9Sstevel@tonic-gate static kstat_t *ksp = NULL;
18827c478bd9Sstevel@tonic-gate kstat_named_t *ksn;
18837c478bd9Sstevel@tonic-gate int la;
18847c478bd9Sstevel@tonic-gate
18857c478bd9Sstevel@tonic-gate if (kc == NULL) /* if not initialized before */
18867c478bd9Sstevel@tonic-gate kc = kstat_open();
18877c478bd9Sstevel@tonic-gate if (kc == NULL)
18887c478bd9Sstevel@tonic-gate {
18897c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18907c478bd9Sstevel@tonic-gate sm_dprintf("getla: kstat_open(): %s\n",
18917c478bd9Sstevel@tonic-gate sm_errstring(errno));
18927c478bd9Sstevel@tonic-gate return -1;
18937c478bd9Sstevel@tonic-gate }
18947c478bd9Sstevel@tonic-gate if (ksp == NULL)
18957c478bd9Sstevel@tonic-gate ksp = kstat_lookup(kc, "unix", 0, "system_misc");
18967c478bd9Sstevel@tonic-gate if (ksp == NULL)
18977c478bd9Sstevel@tonic-gate {
18987c478bd9Sstevel@tonic-gate if (tTd(3, 1))
18997c478bd9Sstevel@tonic-gate sm_dprintf("getla: kstat_lookup(): %s\n",
19007c478bd9Sstevel@tonic-gate sm_errstring(errno));
19017c478bd9Sstevel@tonic-gate return -1;
19027c478bd9Sstevel@tonic-gate }
19037c478bd9Sstevel@tonic-gate if (kstat_read(kc, ksp, NULL) < 0)
19047c478bd9Sstevel@tonic-gate {
19057c478bd9Sstevel@tonic-gate if (tTd(3, 1))
19067c478bd9Sstevel@tonic-gate sm_dprintf("getla: kstat_read(): %s\n",
19077c478bd9Sstevel@tonic-gate sm_errstring(errno));
19087c478bd9Sstevel@tonic-gate return -1;
19097c478bd9Sstevel@tonic-gate }
19107c478bd9Sstevel@tonic-gate ksn = (kstat_named_t *) kstat_data_lookup(ksp, "avenrun_1min");
19117c478bd9Sstevel@tonic-gate la = ((double) ksn->value.ul + FSCALE/2) / FSCALE;
19127c478bd9Sstevel@tonic-gate /* kstat_close(kc); /o do not close for fast access */
19137c478bd9Sstevel@tonic-gate return la;
19147c478bd9Sstevel@tonic-gate }
19157c478bd9Sstevel@tonic-gate
19167c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_KSTAT */
19177c478bd9Sstevel@tonic-gate
19187c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_DEVSHORT
19197c478bd9Sstevel@tonic-gate
19207c478bd9Sstevel@tonic-gate /*
19217c478bd9Sstevel@tonic-gate ** Read /dev/table/avenrun for the load average. This should contain
19227c478bd9Sstevel@tonic-gate ** three shorts for the 1, 5, and 15 minute loads. We only read the
19237c478bd9Sstevel@tonic-gate ** first, since that's all we care about.
19247c478bd9Sstevel@tonic-gate **
19257c478bd9Sstevel@tonic-gate ** Intended for SCO OpenServer 5.
19267c478bd9Sstevel@tonic-gate */
19277c478bd9Sstevel@tonic-gate
19287c478bd9Sstevel@tonic-gate # ifndef _PATH_AVENRUN
19297c478bd9Sstevel@tonic-gate # define _PATH_AVENRUN "/dev/table/avenrun"
19307c478bd9Sstevel@tonic-gate # endif /* ! _PATH_AVENRUN */
19317c478bd9Sstevel@tonic-gate
19327c478bd9Sstevel@tonic-gate int
getla()19337c478bd9Sstevel@tonic-gate getla()
19347c478bd9Sstevel@tonic-gate {
19357c478bd9Sstevel@tonic-gate static int afd = -1;
19367c478bd9Sstevel@tonic-gate short avenrun;
19377c478bd9Sstevel@tonic-gate int loadav;
19387c478bd9Sstevel@tonic-gate int r;
19397c478bd9Sstevel@tonic-gate
19407c478bd9Sstevel@tonic-gate errno = EBADF;
19417c478bd9Sstevel@tonic-gate
19427c478bd9Sstevel@tonic-gate if (afd == -1 || lseek(afd, 0L, SEEK_SET) == -1)
19437c478bd9Sstevel@tonic-gate {
19447c478bd9Sstevel@tonic-gate if (errno != EBADF)
19457c478bd9Sstevel@tonic-gate return -1;
19467c478bd9Sstevel@tonic-gate afd = open(_PATH_AVENRUN, O_RDONLY|O_SYNC);
19477c478bd9Sstevel@tonic-gate if (afd < 0)
19487c478bd9Sstevel@tonic-gate {
19497c478bd9Sstevel@tonic-gate sm_syslog(LOG_ERR, NOQID,
19507c478bd9Sstevel@tonic-gate "can't open %s: %s",
19517c478bd9Sstevel@tonic-gate _PATH_AVENRUN, sm_errstring(errno));
19527c478bd9Sstevel@tonic-gate return -1;
19537c478bd9Sstevel@tonic-gate }
19547c478bd9Sstevel@tonic-gate }
19557c478bd9Sstevel@tonic-gate
1956058561cbSjbeck r = read(afd, &avenrun, sizeof(avenrun));
1957d4660949Sjbeck if (r != sizeof(avenrun))
1958d4660949Sjbeck {
1959d4660949Sjbeck sm_syslog(LOG_ERR, NOQID,
1960d4660949Sjbeck "can't read %s: %s", _PATH_AVENRUN,
1961d4660949Sjbeck r == -1 ? sm_errstring(errno) : "short read");
1962d4660949Sjbeck return -1;
1963d4660949Sjbeck }
19647c478bd9Sstevel@tonic-gate
19657c478bd9Sstevel@tonic-gate if (tTd(3, 5))
19667c478bd9Sstevel@tonic-gate sm_dprintf("getla: avenrun = %d\n", avenrun);
19677c478bd9Sstevel@tonic-gate loadav = (int) (avenrun + FSCALE/2) >> FSHIFT;
19687c478bd9Sstevel@tonic-gate if (tTd(3, 1))
19697c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", loadav);
19707c478bd9Sstevel@tonic-gate return loadav;
19717c478bd9Sstevel@tonic-gate }
19727c478bd9Sstevel@tonic-gate
19737c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_DEVSHORT */
19747c478bd9Sstevel@tonic-gate
19757c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_ALPHAOSF
19767c478bd9Sstevel@tonic-gate struct rtentry;
19777c478bd9Sstevel@tonic-gate struct mbuf;
19787c478bd9Sstevel@tonic-gate # include <sys/table.h>
19797c478bd9Sstevel@tonic-gate
19807c478bd9Sstevel@tonic-gate int
getla()19817c478bd9Sstevel@tonic-gate getla()
19827c478bd9Sstevel@tonic-gate {
19837c478bd9Sstevel@tonic-gate int ave = 0;
19847c478bd9Sstevel@tonic-gate struct tbl_loadavg tab;
19857c478bd9Sstevel@tonic-gate
19867c478bd9Sstevel@tonic-gate if (table(TBL_LOADAVG, 0, &tab, 1, sizeof(tab)) == -1)
19877c478bd9Sstevel@tonic-gate {
19887c478bd9Sstevel@tonic-gate if (tTd(3, 1))
19897c478bd9Sstevel@tonic-gate sm_dprintf("getla: table %s\n", sm_errstring(errno));
19907c478bd9Sstevel@tonic-gate return -1;
19917c478bd9Sstevel@tonic-gate }
19927c478bd9Sstevel@tonic-gate
19937c478bd9Sstevel@tonic-gate if (tTd(3, 1))
19947c478bd9Sstevel@tonic-gate sm_dprintf("getla: scale = %d\n", tab.tl_lscale);
19957c478bd9Sstevel@tonic-gate
19967c478bd9Sstevel@tonic-gate if (tab.tl_lscale)
19977c478bd9Sstevel@tonic-gate ave = ((tab.tl_avenrun.l[2] + (tab.tl_lscale/2)) /
19987c478bd9Sstevel@tonic-gate tab.tl_lscale);
19997c478bd9Sstevel@tonic-gate else
20007c478bd9Sstevel@tonic-gate ave = (int) (tab.tl_avenrun.d[2] + 0.5);
20017c478bd9Sstevel@tonic-gate
20027c478bd9Sstevel@tonic-gate if (tTd(3, 1))
20037c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", ave);
20047c478bd9Sstevel@tonic-gate
20057c478bd9Sstevel@tonic-gate return ave;
20067c478bd9Sstevel@tonic-gate }
20077c478bd9Sstevel@tonic-gate
20087c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_ALPHAOSF */
20097c478bd9Sstevel@tonic-gate
20107c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_PSET
20117c478bd9Sstevel@tonic-gate
20127c478bd9Sstevel@tonic-gate int
getla()20137c478bd9Sstevel@tonic-gate getla()
20147c478bd9Sstevel@tonic-gate {
20157c478bd9Sstevel@tonic-gate double avenrun[3];
20167c478bd9Sstevel@tonic-gate
20177c478bd9Sstevel@tonic-gate if (pset_getloadavg(PS_MYID, avenrun,
20187c478bd9Sstevel@tonic-gate sizeof(avenrun) / sizeof(avenrun[0])) < 0)
20197c478bd9Sstevel@tonic-gate {
20207c478bd9Sstevel@tonic-gate if (tTd(3, 1))
20217c478bd9Sstevel@tonic-gate sm_dprintf("getla: pset_getloadavg failed: %s",
20227c478bd9Sstevel@tonic-gate sm_errstring(errno));
20237c478bd9Sstevel@tonic-gate return -1;
20247c478bd9Sstevel@tonic-gate }
20257c478bd9Sstevel@tonic-gate if (tTd(3, 1))
20267c478bd9Sstevel@tonic-gate sm_dprintf("getla: %d\n", (int) (avenrun[0] +0.5));
20277c478bd9Sstevel@tonic-gate return ((int) (avenrun[0] + 0.5));
20287c478bd9Sstevel@tonic-gate }
20297c478bd9Sstevel@tonic-gate
20307c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_PSET */
20317c478bd9Sstevel@tonic-gate
20327c478bd9Sstevel@tonic-gate #if LA_TYPE == LA_ZERO
20337c478bd9Sstevel@tonic-gate
20347c478bd9Sstevel@tonic-gate int
getla()20357c478bd9Sstevel@tonic-gate getla()
20367c478bd9Sstevel@tonic-gate {
20377c478bd9Sstevel@tonic-gate if (tTd(3, 1))
20387c478bd9Sstevel@tonic-gate sm_dprintf("getla: ZERO\n");
20397c478bd9Sstevel@tonic-gate return 0;
20407c478bd9Sstevel@tonic-gate }
20417c478bd9Sstevel@tonic-gate
20427c478bd9Sstevel@tonic-gate #endif /* LA_TYPE == LA_ZERO */
20437c478bd9Sstevel@tonic-gate
20447c478bd9Sstevel@tonic-gate /*
20457c478bd9Sstevel@tonic-gate * Copyright 1989 Massachusetts Institute of Technology
20467c478bd9Sstevel@tonic-gate *
20477c478bd9Sstevel@tonic-gate * Permission to use, copy, modify, distribute, and sell this software and its
20487c478bd9Sstevel@tonic-gate * documentation for any purpose is hereby granted without fee, provided that
20497c478bd9Sstevel@tonic-gate * the above copyright notice appear in all copies and that both that
20507c478bd9Sstevel@tonic-gate * copyright notice and this permission notice appear in supporting
20517c478bd9Sstevel@tonic-gate * documentation, and that the name of M.I.T. not be used in advertising or
20527c478bd9Sstevel@tonic-gate * publicity pertaining to distribution of the software without specific,
20537c478bd9Sstevel@tonic-gate * written prior permission. M.I.T. makes no representations about the
20547c478bd9Sstevel@tonic-gate * suitability of this software for any purpose. It is provided "as is"
20557c478bd9Sstevel@tonic-gate * without express or implied warranty.
20567c478bd9Sstevel@tonic-gate *
20577c478bd9Sstevel@tonic-gate * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
20587c478bd9Sstevel@tonic-gate * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
20597c478bd9Sstevel@tonic-gate * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20607c478bd9Sstevel@tonic-gate * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20617c478bd9Sstevel@tonic-gate * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
20627c478bd9Sstevel@tonic-gate * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20637c478bd9Sstevel@tonic-gate *
20647c478bd9Sstevel@tonic-gate * Authors: Many and varied...
20657c478bd9Sstevel@tonic-gate */
20667c478bd9Sstevel@tonic-gate
20677c478bd9Sstevel@tonic-gate /* Non Apollo stuff removed by Don Lewis 11/15/93 */
20687c478bd9Sstevel@tonic-gate #ifndef lint
20697c478bd9Sstevel@tonic-gate SM_UNUSED(static char rcsid[]) = "@(#)$OrigId: getloadavg.c,v 1.16 1991/06/21 12:51:15 paul Exp $";
20707c478bd9Sstevel@tonic-gate #endif /* ! lint */
20717c478bd9Sstevel@tonic-gate
20727c478bd9Sstevel@tonic-gate #ifdef apollo
20737c478bd9Sstevel@tonic-gate # undef volatile
20747c478bd9Sstevel@tonic-gate # include <apollo/base.h>
20757c478bd9Sstevel@tonic-gate
20767c478bd9Sstevel@tonic-gate /* ARGSUSED */
getloadavg(call_data)20777c478bd9Sstevel@tonic-gate int getloadavg( call_data )
20787c478bd9Sstevel@tonic-gate caddr_t call_data; /* pointer to (double) return value */
20797c478bd9Sstevel@tonic-gate {
20807c478bd9Sstevel@tonic-gate double *avenrun = (double *) call_data;
20817c478bd9Sstevel@tonic-gate int i;
20827c478bd9Sstevel@tonic-gate status_$t st;
20837c478bd9Sstevel@tonic-gate long loadav[3];
20847c478bd9Sstevel@tonic-gate
20857c478bd9Sstevel@tonic-gate proc1_$get_loadav(loadav, &st);
20867c478bd9Sstevel@tonic-gate *avenrun = loadav[0] / (double) (1 << 16);
20877c478bd9Sstevel@tonic-gate return 0;
20887c478bd9Sstevel@tonic-gate }
20897c478bd9Sstevel@tonic-gate #endif /* apollo */
20907c478bd9Sstevel@tonic-gate /*
20917c478bd9Sstevel@tonic-gate ** SM_GETLA -- get the current load average
20927c478bd9Sstevel@tonic-gate **
20937c478bd9Sstevel@tonic-gate ** Parameters:
20947c478bd9Sstevel@tonic-gate ** none
20957c478bd9Sstevel@tonic-gate **
20967c478bd9Sstevel@tonic-gate ** Returns:
20977c478bd9Sstevel@tonic-gate ** none
20987c478bd9Sstevel@tonic-gate **
20997c478bd9Sstevel@tonic-gate ** Side Effects:
21007c478bd9Sstevel@tonic-gate ** Set CurrentLA to the current load average.
21017c478bd9Sstevel@tonic-gate ** Set {load_avg} in GlobalMacros to the current load average.
21027c478bd9Sstevel@tonic-gate */
21037c478bd9Sstevel@tonic-gate
21047c478bd9Sstevel@tonic-gate void
sm_getla()21057c478bd9Sstevel@tonic-gate sm_getla()
21067c478bd9Sstevel@tonic-gate {
21077c478bd9Sstevel@tonic-gate char labuf[8];
21087c478bd9Sstevel@tonic-gate
21097c478bd9Sstevel@tonic-gate CurrentLA = getla();
2110058561cbSjbeck (void) sm_snprintf(labuf, sizeof(labuf), "%d", CurrentLA);
21117c478bd9Sstevel@tonic-gate macdefine(&GlobalMacros, A_TEMP, macid("{load_avg}"), labuf);
21127c478bd9Sstevel@tonic-gate }
21137c478bd9Sstevel@tonic-gate /*
21147c478bd9Sstevel@tonic-gate ** SHOULDQUEUE -- should this message be queued or sent?
21157c478bd9Sstevel@tonic-gate **
21167c478bd9Sstevel@tonic-gate ** Compares the message cost to the load average to decide.
21177c478bd9Sstevel@tonic-gate **
21187c478bd9Sstevel@tonic-gate ** Note: Do NOT change this API! It is documented in op.me
21197c478bd9Sstevel@tonic-gate ** and theoretically the user can change this function...
21207c478bd9Sstevel@tonic-gate **
21217c478bd9Sstevel@tonic-gate ** Parameters:
21227c478bd9Sstevel@tonic-gate ** pri -- the priority of the message in question.
21237c478bd9Sstevel@tonic-gate ** ct -- the message creation time (unused, but see above).
21247c478bd9Sstevel@tonic-gate **
21257c478bd9Sstevel@tonic-gate ** Returns:
21267c478bd9Sstevel@tonic-gate ** true -- if this message should be queued up for the
21277c478bd9Sstevel@tonic-gate ** time being.
21287c478bd9Sstevel@tonic-gate ** false -- if the load is low enough to send this message.
21297c478bd9Sstevel@tonic-gate **
21307c478bd9Sstevel@tonic-gate ** Side Effects:
21317c478bd9Sstevel@tonic-gate ** none.
21327c478bd9Sstevel@tonic-gate */
21337c478bd9Sstevel@tonic-gate
21347c478bd9Sstevel@tonic-gate /* ARGSUSED1 */
21357c478bd9Sstevel@tonic-gate bool
shouldqueue(pri,ct)21367c478bd9Sstevel@tonic-gate shouldqueue(pri, ct)
21377c478bd9Sstevel@tonic-gate long pri;
21387c478bd9Sstevel@tonic-gate time_t ct;
21397c478bd9Sstevel@tonic-gate {
21407c478bd9Sstevel@tonic-gate bool rval;
2141445f2479Sjbeck #if _FFR_MEMSTAT
2142445f2479Sjbeck long memfree;
2143445f2479Sjbeck #endif /* _FFR_MEMSTAT */
21447c478bd9Sstevel@tonic-gate
21457c478bd9Sstevel@tonic-gate if (tTd(3, 30))
21467c478bd9Sstevel@tonic-gate sm_dprintf("shouldqueue: CurrentLA=%d, pri=%ld: ",
21477c478bd9Sstevel@tonic-gate CurrentLA, pri);
2148445f2479Sjbeck
2149445f2479Sjbeck #if _FFR_MEMSTAT
2150445f2479Sjbeck if (QueueLowMem > 0 &&
2151445f2479Sjbeck sm_memstat_get(MemoryResource, &memfree) >= 0 &&
2152445f2479Sjbeck memfree < QueueLowMem)
2153445f2479Sjbeck {
2154445f2479Sjbeck if (tTd(3, 30))
21553ee0e492Sjbeck sm_dprintf("true (memfree=%ld < QueueLowMem=%ld)\n",
2156445f2479Sjbeck memfree, QueueLowMem);
2157445f2479Sjbeck return true;
2158445f2479Sjbeck }
2159445f2479Sjbeck #endif /* _FFR_MEMSTAT */
21607c478bd9Sstevel@tonic-gate if (CurrentLA < QueueLA)
21617c478bd9Sstevel@tonic-gate {
21627c478bd9Sstevel@tonic-gate if (tTd(3, 30))
21637c478bd9Sstevel@tonic-gate sm_dprintf("false (CurrentLA < QueueLA)\n");
21647c478bd9Sstevel@tonic-gate return false;
21657c478bd9Sstevel@tonic-gate }
21667c478bd9Sstevel@tonic-gate rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1));
21677c478bd9Sstevel@tonic-gate if (tTd(3, 30))
21687c478bd9Sstevel@tonic-gate sm_dprintf("%s (by calculation)\n", rval ? "true" : "false");
21697c478bd9Sstevel@tonic-gate return rval;
21707c478bd9Sstevel@tonic-gate }
2171058561cbSjbeck
21727c478bd9Sstevel@tonic-gate /*
21737c478bd9Sstevel@tonic-gate ** REFUSECONNECTIONS -- decide if connections should be refused
21747c478bd9Sstevel@tonic-gate **
21757c478bd9Sstevel@tonic-gate ** Parameters:
21767c478bd9Sstevel@tonic-gate ** e -- the current envelope.
2177058561cbSjbeck ** dn -- number of daemon.
21787c478bd9Sstevel@tonic-gate ** active -- was this daemon actually active?
21797c478bd9Sstevel@tonic-gate **
21807c478bd9Sstevel@tonic-gate ** Returns:
21817c478bd9Sstevel@tonic-gate ** true if incoming SMTP connections should be refused
21827c478bd9Sstevel@tonic-gate ** (for now).
21837c478bd9Sstevel@tonic-gate ** false if we should accept new work.
21847c478bd9Sstevel@tonic-gate **
21857c478bd9Sstevel@tonic-gate ** Side Effects:
21867c478bd9Sstevel@tonic-gate ** Sets process title when it is rejecting connections.
21877c478bd9Sstevel@tonic-gate */
21887c478bd9Sstevel@tonic-gate
21897c478bd9Sstevel@tonic-gate bool
refuseconnections(e,dn,active)2190058561cbSjbeck refuseconnections(e, dn, active)
21917c478bd9Sstevel@tonic-gate ENVELOPE *e;
2192058561cbSjbeck int dn;
21937c478bd9Sstevel@tonic-gate bool active;
21947c478bd9Sstevel@tonic-gate {
21957c478bd9Sstevel@tonic-gate static time_t lastconn[MAXDAEMONS];
21967c478bd9Sstevel@tonic-gate static int conncnt[MAXDAEMONS];
21977c478bd9Sstevel@tonic-gate static time_t firstrejtime[MAXDAEMONS];
21987c478bd9Sstevel@tonic-gate static time_t nextlogtime[MAXDAEMONS];
2199058561cbSjbeck int limit;
2200445f2479Sjbeck #if _FFR_MEMSTAT
2201445f2479Sjbeck long memfree;
2202445f2479Sjbeck #endif /* _FFR_MEMSTAT */
22037c478bd9Sstevel@tonic-gate
22047c478bd9Sstevel@tonic-gate #if XLA
22057c478bd9Sstevel@tonic-gate if (!xla_smtp_ok())
22067c478bd9Sstevel@tonic-gate return true;
22077c478bd9Sstevel@tonic-gate #endif /* XLA */
22087c478bd9Sstevel@tonic-gate
2209058561cbSjbeck SM_ASSERT(dn >= 0);
2210058561cbSjbeck SM_ASSERT(dn < MAXDAEMONS);
22117c478bd9Sstevel@tonic-gate if (ConnRateThrottle > 0)
22127c478bd9Sstevel@tonic-gate {
22137c478bd9Sstevel@tonic-gate time_t now;
22147c478bd9Sstevel@tonic-gate
22157c478bd9Sstevel@tonic-gate now = curtime();
22167c478bd9Sstevel@tonic-gate if (active)
22177c478bd9Sstevel@tonic-gate {
2218058561cbSjbeck if (now != lastconn[dn])
22197c478bd9Sstevel@tonic-gate {
2220058561cbSjbeck lastconn[dn] = now;
2221058561cbSjbeck conncnt[dn] = 1;
22227c478bd9Sstevel@tonic-gate }
2223058561cbSjbeck else if (conncnt[dn]++ > ConnRateThrottle)
22247c478bd9Sstevel@tonic-gate {
22257c478bd9Sstevel@tonic-gate #define D_MSG_CRT "deferring connections on daemon %s: %d per second"
22267c478bd9Sstevel@tonic-gate /* sleep to flatten out connection load */
22277c478bd9Sstevel@tonic-gate sm_setproctitle(true, e, D_MSG_CRT,
2228058561cbSjbeck Daemons[dn].d_name,
2229058561cbSjbeck ConnRateThrottle);
22307c478bd9Sstevel@tonic-gate if (LogLevel > 8)
22317c478bd9Sstevel@tonic-gate sm_syslog(LOG_INFO, NOQID, D_MSG_CRT,
2232058561cbSjbeck Daemons[dn].d_name,
2233058561cbSjbeck ConnRateThrottle);
22347c478bd9Sstevel@tonic-gate (void) sleep(1);
22357c478bd9Sstevel@tonic-gate }
22367c478bd9Sstevel@tonic-gate }
2237058561cbSjbeck else if (now != lastconn[dn])
2238058561cbSjbeck conncnt[dn] = 0;
22397c478bd9Sstevel@tonic-gate }
22407c478bd9Sstevel@tonic-gate
2241445f2479Sjbeck
2242445f2479Sjbeck #if _FFR_MEMSTAT
2243445f2479Sjbeck if (RefuseLowMem > 0 &&
2244445f2479Sjbeck sm_memstat_get(MemoryResource, &memfree) >= 0 &&
2245445f2479Sjbeck memfree < RefuseLowMem)
2246445f2479Sjbeck {
2247445f2479Sjbeck # define R_MSG_LM "rejecting connections on daemon %s: free memory: %ld"
2248058561cbSjbeck sm_setproctitle(true, e, R_MSG_LM, Daemons[dn].d_name, memfree);
2249445f2479Sjbeck if (LogLevel > 8)
2250058561cbSjbeck sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM,
2251058561cbSjbeck Daemons[dn].d_name, memfree);
2252445f2479Sjbeck return true;
2253445f2479Sjbeck }
2254445f2479Sjbeck #endif /* _FFR_MEMSTAT */
22557c478bd9Sstevel@tonic-gate sm_getla();
2256058561cbSjbeck limit = (Daemons[dn].d_refuseLA != DPO_NOTSET) ?
2257058561cbSjbeck Daemons[dn].d_refuseLA : RefuseLA;
2258058561cbSjbeck if (limit > 0 && CurrentLA >= limit)
22597c478bd9Sstevel@tonic-gate {
22607c478bd9Sstevel@tonic-gate time_t now;
22617c478bd9Sstevel@tonic-gate
22627c478bd9Sstevel@tonic-gate # define R_MSG_LA "rejecting connections on daemon %s: load average: %d"
22637c478bd9Sstevel@tonic-gate # define R2_MSG_LA "have been rejecting connections on daemon %s for %s"
2264058561cbSjbeck sm_setproctitle(true, e, R_MSG_LA, Daemons[dn].d_name,
2265058561cbSjbeck CurrentLA);
22667c478bd9Sstevel@tonic-gate if (LogLevel > 8)
2267058561cbSjbeck sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA,
2268058561cbSjbeck Daemons[dn].d_name, CurrentLA);
22697c478bd9Sstevel@tonic-gate now = curtime();
2270058561cbSjbeck if (firstrejtime[dn] == 0)
22717c478bd9Sstevel@tonic-gate {
2272058561cbSjbeck firstrejtime[dn] = now;
2273058561cbSjbeck nextlogtime[dn] = now + RejectLogInterval;
22747c478bd9Sstevel@tonic-gate }
2275058561cbSjbeck else if (nextlogtime[dn] < now)
22767c478bd9Sstevel@tonic-gate {
2277058561cbSjbeck sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, Daemons[dn].d_name,
2278058561cbSjbeck pintvl(now - firstrejtime[dn], true));
2279058561cbSjbeck nextlogtime[dn] = now + RejectLogInterval;
22807c478bd9Sstevel@tonic-gate }
22817c478bd9Sstevel@tonic-gate return true;
22827c478bd9Sstevel@tonic-gate }
22837c478bd9Sstevel@tonic-gate else
2284058561cbSjbeck firstrejtime[dn] = 0;
22857c478bd9Sstevel@tonic-gate
2286058561cbSjbeck limit = (Daemons[dn].d_delayLA != DPO_NOTSET) ?
2287058561cbSjbeck Daemons[dn].d_delayLA : DelayLA;
2288058561cbSjbeck if (limit > 0 && CurrentLA >= limit)
22897c478bd9Sstevel@tonic-gate {
22907c478bd9Sstevel@tonic-gate time_t now;
22917c478bd9Sstevel@tonic-gate static time_t log_delay = (time_t) 0;
22927c478bd9Sstevel@tonic-gate
22937c478bd9Sstevel@tonic-gate # define MIN_DELAY_LOG 90 /* wait before logging this again */
22947c478bd9Sstevel@tonic-gate # define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d"
22957c478bd9Sstevel@tonic-gate /* sleep to flatten out connection load */
2296*e9af4bc0SJohn Beck sm_setproctitle(true, e, D_MSG_LA, Daemons[dn].d_name,
2297*e9af4bc0SJohn Beck CurrentLA, limit);
22987c478bd9Sstevel@tonic-gate if (LogLevel > 8 && (now = curtime()) > log_delay)
22997c478bd9Sstevel@tonic-gate {
23007c478bd9Sstevel@tonic-gate sm_syslog(LOG_INFO, NOQID, D_MSG_LA,
2301058561cbSjbeck Daemons[dn].d_name, CurrentLA, limit);
23027c478bd9Sstevel@tonic-gate log_delay = now + MIN_DELAY_LOG;
23037c478bd9Sstevel@tonic-gate }
23047c478bd9Sstevel@tonic-gate (void) sleep(1);
23057c478bd9Sstevel@tonic-gate }
23067c478bd9Sstevel@tonic-gate
2307058561cbSjbeck limit = (Daemons[dn].d_maxchildren != DPO_NOTSET) ?
2308058561cbSjbeck Daemons[dn].d_maxchildren : MaxChildren;
2309058561cbSjbeck if (limit > 0 && CurChildren >= limit)
23107c478bd9Sstevel@tonic-gate {
23117c478bd9Sstevel@tonic-gate proc_list_probe();
2312058561cbSjbeck if (CurChildren >= limit)
23137c478bd9Sstevel@tonic-gate {
23147c478bd9Sstevel@tonic-gate #define R_MSG_CHILD "rejecting connections on daemon %s: %d children, max %d"
23157c478bd9Sstevel@tonic-gate sm_setproctitle(true, e, R_MSG_CHILD,
2316058561cbSjbeck Daemons[dn].d_name, CurChildren,
2317058561cbSjbeck limit);
23187c478bd9Sstevel@tonic-gate if (LogLevel > 8)
23197c478bd9Sstevel@tonic-gate sm_syslog(LOG_INFO, NOQID, R_MSG_CHILD,
2320058561cbSjbeck Daemons[dn].d_name, CurChildren,
2321058561cbSjbeck limit);
23227c478bd9Sstevel@tonic-gate return true;
23237c478bd9Sstevel@tonic-gate }
23247c478bd9Sstevel@tonic-gate }
23257c478bd9Sstevel@tonic-gate return false;
23267c478bd9Sstevel@tonic-gate }
2327058561cbSjbeck
23287c478bd9Sstevel@tonic-gate /*
23297c478bd9Sstevel@tonic-gate ** SETPROCTITLE -- set process title for ps
23307c478bd9Sstevel@tonic-gate **
23317c478bd9Sstevel@tonic-gate ** Parameters:
23327c478bd9Sstevel@tonic-gate ** fmt -- a printf style format string.
23337c478bd9Sstevel@tonic-gate ** a, b, c -- possible parameters to fmt.
23347c478bd9Sstevel@tonic-gate **
23357c478bd9Sstevel@tonic-gate ** Returns:
23367c478bd9Sstevel@tonic-gate ** none.
23377c478bd9Sstevel@tonic-gate **
23387c478bd9Sstevel@tonic-gate ** Side Effects:
23397c478bd9Sstevel@tonic-gate ** Clobbers argv of our main procedure so ps(1) will
23407c478bd9Sstevel@tonic-gate ** display the title.
23417c478bd9Sstevel@tonic-gate */
23427c478bd9Sstevel@tonic-gate
23437c478bd9Sstevel@tonic-gate #define SPT_NONE 0 /* don't use it at all */
23447c478bd9Sstevel@tonic-gate #define SPT_REUSEARGV 1 /* cover argv with title information */
23457c478bd9Sstevel@tonic-gate #define SPT_BUILTIN 2 /* use libc builtin */
23467c478bd9Sstevel@tonic-gate #define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */
23477c478bd9Sstevel@tonic-gate #define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */
23487c478bd9Sstevel@tonic-gate #define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */
23497c478bd9Sstevel@tonic-gate #define SPT_SCO 6 /* write kernel u. area */
23507c478bd9Sstevel@tonic-gate #define SPT_CHANGEARGV 7 /* write our own strings into argv[] */
23517c478bd9Sstevel@tonic-gate
23527c478bd9Sstevel@tonic-gate #ifndef SPT_TYPE
23537c478bd9Sstevel@tonic-gate # define SPT_TYPE SPT_REUSEARGV
23547c478bd9Sstevel@tonic-gate #endif /* ! SPT_TYPE */
23557c478bd9Sstevel@tonic-gate
23567c478bd9Sstevel@tonic-gate
23577c478bd9Sstevel@tonic-gate #if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN
23587c478bd9Sstevel@tonic-gate
23597c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSTAT
23607c478bd9Sstevel@tonic-gate # include <sys/pstat.h>
23617c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSTAT */
23627c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSSTRINGS
23637c478bd9Sstevel@tonic-gate # include <machine/vmparam.h>
23647c478bd9Sstevel@tonic-gate # include <sys/exec.h>
23657c478bd9Sstevel@tonic-gate # ifndef PS_STRINGS /* hmmmm.... apparently not available after all */
23667c478bd9Sstevel@tonic-gate # undef SPT_TYPE
23677c478bd9Sstevel@tonic-gate # define SPT_TYPE SPT_REUSEARGV
23687c478bd9Sstevel@tonic-gate # else /* ! PS_STRINGS */
23697c478bd9Sstevel@tonic-gate # ifndef NKPDE /* FreeBSD 2.0 */
23707c478bd9Sstevel@tonic-gate # define NKPDE 63
23717c478bd9Sstevel@tonic-gate typedef unsigned int *pt_entry_t;
23727c478bd9Sstevel@tonic-gate # endif /* ! NKPDE */
23737c478bd9Sstevel@tonic-gate # endif /* ! PS_STRINGS */
23747c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSSTRINGS */
23757c478bd9Sstevel@tonic-gate
23767c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV
23777c478bd9Sstevel@tonic-gate # define SETPROC_STATIC static
23787c478bd9Sstevel@tonic-gate # else /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */
23797c478bd9Sstevel@tonic-gate # define SETPROC_STATIC
23807c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSSTRINGS || SPT_TYPE == SPT_CHANGEARGV */
23817c478bd9Sstevel@tonic-gate
23827c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_SYSMIPS
23837c478bd9Sstevel@tonic-gate # include <sys/sysmips.h>
23847c478bd9Sstevel@tonic-gate # include <sys/sysnews.h>
23857c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_SYSMIPS */
23867c478bd9Sstevel@tonic-gate
23877c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_SCO
23887c478bd9Sstevel@tonic-gate # include <sys/immu.h>
23897c478bd9Sstevel@tonic-gate # include <sys/dir.h>
23907c478bd9Sstevel@tonic-gate # include <sys/user.h>
23917c478bd9Sstevel@tonic-gate # include <sys/fs/s5param.h>
23927c478bd9Sstevel@tonic-gate # if PSARGSZ > MAXLINE
23937c478bd9Sstevel@tonic-gate # define SPT_BUFSIZE PSARGSZ
23947c478bd9Sstevel@tonic-gate # endif /* PSARGSZ > MAXLINE */
23957c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_SCO */
23967c478bd9Sstevel@tonic-gate
23977c478bd9Sstevel@tonic-gate # ifndef SPT_PADCHAR
23987c478bd9Sstevel@tonic-gate # define SPT_PADCHAR ' '
23997c478bd9Sstevel@tonic-gate # endif /* ! SPT_PADCHAR */
24007c478bd9Sstevel@tonic-gate
24017c478bd9Sstevel@tonic-gate #endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */
24027c478bd9Sstevel@tonic-gate
24037c478bd9Sstevel@tonic-gate #ifndef SPT_BUFSIZE
24047c478bd9Sstevel@tonic-gate # define SPT_BUFSIZE MAXLINE
24057c478bd9Sstevel@tonic-gate #endif /* ! SPT_BUFSIZE */
24067c478bd9Sstevel@tonic-gate
24077c478bd9Sstevel@tonic-gate #if _FFR_SPT_ALIGN
24087c478bd9Sstevel@tonic-gate
24097c478bd9Sstevel@tonic-gate /*
24107c478bd9Sstevel@tonic-gate ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to
24117c478bd9Sstevel@tonic-gate ** 64 bit alignment, so unless each piece of argv and envp is a multiple
24127c478bd9Sstevel@tonic-gate ** of 8 bytes (including terminating NULL), initsetproctitle() won't use
24137c478bd9Sstevel@tonic-gate ** any of the space beyond argv[0]. Be sure to set SPT_ALIGN_SIZE if
24147c478bd9Sstevel@tonic-gate ** you use this FFR.
24157c478bd9Sstevel@tonic-gate */
24167c478bd9Sstevel@tonic-gate
24177c478bd9Sstevel@tonic-gate # ifdef SPT_ALIGN_SIZE
24187c478bd9Sstevel@tonic-gate # define SPT_ALIGN(x, align) (((((x) + SPT_ALIGN_SIZE) >> (align)) << (align)) - 1)
24197c478bd9Sstevel@tonic-gate # else /* SPT_ALIGN_SIZE */
24207c478bd9Sstevel@tonic-gate # define SPT_ALIGN(x, align) (x)
24217c478bd9Sstevel@tonic-gate # endif /* SPT_ALIGN_SIZE */
24227c478bd9Sstevel@tonic-gate #else /* _FFR_SPT_ALIGN */
24237c478bd9Sstevel@tonic-gate # define SPT_ALIGN(x, align) (x)
24247c478bd9Sstevel@tonic-gate #endif /* _FFR_SPT_ALIGN */
24257c478bd9Sstevel@tonic-gate
24267c478bd9Sstevel@tonic-gate /*
24277c478bd9Sstevel@tonic-gate ** Pointers for setproctitle.
24287c478bd9Sstevel@tonic-gate ** This allows "ps" listings to give more useful information.
24297c478bd9Sstevel@tonic-gate */
24307c478bd9Sstevel@tonic-gate
24317c478bd9Sstevel@tonic-gate static char **Argv = NULL; /* pointer to argument vector */
24327c478bd9Sstevel@tonic-gate static char *LastArgv = NULL; /* end of argv */
24337c478bd9Sstevel@tonic-gate #if SPT_TYPE != SPT_BUILTIN
24347c478bd9Sstevel@tonic-gate static void setproctitle __P((const char *, ...));
24357c478bd9Sstevel@tonic-gate #endif /* SPT_TYPE != SPT_BUILTIN */
24367c478bd9Sstevel@tonic-gate
24377c478bd9Sstevel@tonic-gate void
initsetproctitle(argc,argv,envp)24387c478bd9Sstevel@tonic-gate initsetproctitle(argc, argv, envp)
24397c478bd9Sstevel@tonic-gate int argc;
24407c478bd9Sstevel@tonic-gate char **argv;
24417c478bd9Sstevel@tonic-gate char **envp;
24427c478bd9Sstevel@tonic-gate {
24437c478bd9Sstevel@tonic-gate register int i;
24447c478bd9Sstevel@tonic-gate int align;
24457c478bd9Sstevel@tonic-gate extern char **environ;
24467c478bd9Sstevel@tonic-gate
24477c478bd9Sstevel@tonic-gate /*
24487c478bd9Sstevel@tonic-gate ** Move the environment so setproctitle can use the space at
24497c478bd9Sstevel@tonic-gate ** the top of memory.
24507c478bd9Sstevel@tonic-gate */
24517c478bd9Sstevel@tonic-gate
24527c478bd9Sstevel@tonic-gate if (envp != NULL)
24537c478bd9Sstevel@tonic-gate {
24547c478bd9Sstevel@tonic-gate for (i = 0; envp[i] != NULL; i++)
24557c478bd9Sstevel@tonic-gate continue;
24567c478bd9Sstevel@tonic-gate environ = (char **) xalloc(sizeof(char *) * (i + 1));
24577c478bd9Sstevel@tonic-gate for (i = 0; envp[i] != NULL; i++)
24587c478bd9Sstevel@tonic-gate environ[i] = newstr(envp[i]);
24597c478bd9Sstevel@tonic-gate environ[i] = NULL;
24607c478bd9Sstevel@tonic-gate }
24617c478bd9Sstevel@tonic-gate
24627c478bd9Sstevel@tonic-gate /*
24637c478bd9Sstevel@tonic-gate ** Save start and extent of argv for setproctitle.
24647c478bd9Sstevel@tonic-gate */
24657c478bd9Sstevel@tonic-gate
24667c478bd9Sstevel@tonic-gate Argv = argv;
24677c478bd9Sstevel@tonic-gate
24687c478bd9Sstevel@tonic-gate /*
24697c478bd9Sstevel@tonic-gate ** Determine how much space we can use for setproctitle.
24707c478bd9Sstevel@tonic-gate ** Use all contiguous argv and envp pointers starting at argv[0]
24717c478bd9Sstevel@tonic-gate */
24727c478bd9Sstevel@tonic-gate
24737c478bd9Sstevel@tonic-gate align = -1;
24747c478bd9Sstevel@tonic-gate # if _FFR_SPT_ALIGN
24757c478bd9Sstevel@tonic-gate # ifdef SPT_ALIGN_SIZE
24767c478bd9Sstevel@tonic-gate for (i = SPT_ALIGN_SIZE; i > 0; i >>= 1)
24777c478bd9Sstevel@tonic-gate align++;
24787c478bd9Sstevel@tonic-gate # endif /* SPT_ALIGN_SIZE */
24797c478bd9Sstevel@tonic-gate # endif /* _FFR_SPT_ALIGN */
24807c478bd9Sstevel@tonic-gate
24817c478bd9Sstevel@tonic-gate for (i = 0; i < argc; i++)
24827c478bd9Sstevel@tonic-gate {
24837c478bd9Sstevel@tonic-gate if (i == 0 || LastArgv + 1 == argv[i])
24847c478bd9Sstevel@tonic-gate LastArgv = argv[i] + SPT_ALIGN(strlen(argv[i]), align);
24857c478bd9Sstevel@tonic-gate }
24867c478bd9Sstevel@tonic-gate for (i = 0; LastArgv != NULL && envp != NULL && envp[i] != NULL; i++)
24877c478bd9Sstevel@tonic-gate {
24887c478bd9Sstevel@tonic-gate if (LastArgv + 1 == envp[i])
24897c478bd9Sstevel@tonic-gate LastArgv = envp[i] + SPT_ALIGN(strlen(envp[i]), align);
24907c478bd9Sstevel@tonic-gate }
24917c478bd9Sstevel@tonic-gate }
24927c478bd9Sstevel@tonic-gate
24937c478bd9Sstevel@tonic-gate #if SPT_TYPE != SPT_BUILTIN
24947c478bd9Sstevel@tonic-gate
24957c478bd9Sstevel@tonic-gate /*VARARGS1*/
24967c478bd9Sstevel@tonic-gate static void
24977c478bd9Sstevel@tonic-gate # ifdef __STDC__
setproctitle(const char * fmt,...)24987c478bd9Sstevel@tonic-gate setproctitle(const char *fmt, ...)
24997c478bd9Sstevel@tonic-gate # else /* __STDC__ */
25007c478bd9Sstevel@tonic-gate setproctitle(fmt, va_alist)
25017c478bd9Sstevel@tonic-gate const char *fmt;
25027c478bd9Sstevel@tonic-gate va_dcl
25037c478bd9Sstevel@tonic-gate # endif /* __STDC__ */
25047c478bd9Sstevel@tonic-gate {
25057c478bd9Sstevel@tonic-gate # if SPT_TYPE != SPT_NONE
25067c478bd9Sstevel@tonic-gate register int i;
25077c478bd9Sstevel@tonic-gate register char *p;
25087c478bd9Sstevel@tonic-gate SETPROC_STATIC char buf[SPT_BUFSIZE];
25097c478bd9Sstevel@tonic-gate SM_VA_LOCAL_DECL
25107c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSTAT
25117c478bd9Sstevel@tonic-gate union pstun pst;
25127c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSTAT */
25137c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_SCO
25147c478bd9Sstevel@tonic-gate int j;
25157c478bd9Sstevel@tonic-gate off_t seek_off;
25167c478bd9Sstevel@tonic-gate static int kmem = -1;
25177c478bd9Sstevel@tonic-gate static pid_t kmempid = -1;
25187c478bd9Sstevel@tonic-gate struct user u;
25197c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_SCO */
25207c478bd9Sstevel@tonic-gate
25217c478bd9Sstevel@tonic-gate p = buf;
25227c478bd9Sstevel@tonic-gate
25237c478bd9Sstevel@tonic-gate /* print sendmail: heading for grep */
25247c478bd9Sstevel@tonic-gate (void) sm_strlcpy(p, "sendmail: ", SPACELEFT(buf, p));
25257c478bd9Sstevel@tonic-gate p += strlen(p);
25267c478bd9Sstevel@tonic-gate
25277c478bd9Sstevel@tonic-gate /* print the argument string */
25287c478bd9Sstevel@tonic-gate SM_VA_START(ap, fmt);
25297c478bd9Sstevel@tonic-gate (void) sm_vsnprintf(p, SPACELEFT(buf, p), fmt, ap);
25307c478bd9Sstevel@tonic-gate SM_VA_END(ap);
25317c478bd9Sstevel@tonic-gate
25327c478bd9Sstevel@tonic-gate i = (int) strlen(buf);
25337c478bd9Sstevel@tonic-gate if (i < 0)
25347c478bd9Sstevel@tonic-gate return;
25357c478bd9Sstevel@tonic-gate
25367c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSTAT
25377c478bd9Sstevel@tonic-gate pst.pst_command = buf;
25387c478bd9Sstevel@tonic-gate pstat(PSTAT_SETCMD, pst, i, 0, 0);
25397c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSTAT */
25407c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_PSSTRINGS
25417c478bd9Sstevel@tonic-gate PS_STRINGS->ps_nargvstr = 1;
25427c478bd9Sstevel@tonic-gate PS_STRINGS->ps_argvstr = buf;
25437c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_PSSTRINGS */
25447c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_SYSMIPS
25457c478bd9Sstevel@tonic-gate sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf);
25467c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_SYSMIPS */
25477c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_SCO
25487c478bd9Sstevel@tonic-gate if (kmem < 0 || kmempid != CurrentPid)
25497c478bd9Sstevel@tonic-gate {
25507c478bd9Sstevel@tonic-gate if (kmem >= 0)
25517c478bd9Sstevel@tonic-gate (void) close(kmem);
25527c478bd9Sstevel@tonic-gate kmem = open(_PATH_KMEM, O_RDWR, 0);
25537c478bd9Sstevel@tonic-gate if (kmem < 0)
25547c478bd9Sstevel@tonic-gate return;
25557c478bd9Sstevel@tonic-gate if ((j = fcntl(kmem, F_GETFD, 0)) < 0 ||
25567c478bd9Sstevel@tonic-gate fcntl(kmem, F_SETFD, j | FD_CLOEXEC) < 0)
25577c478bd9Sstevel@tonic-gate {
25587c478bd9Sstevel@tonic-gate (void) close(kmem);
25597c478bd9Sstevel@tonic-gate kmem = -1;
25607c478bd9Sstevel@tonic-gate return;
25617c478bd9Sstevel@tonic-gate }
25627c478bd9Sstevel@tonic-gate kmempid = CurrentPid;
25637c478bd9Sstevel@tonic-gate }
25647c478bd9Sstevel@tonic-gate buf[PSARGSZ - 1] = '\0';
25657c478bd9Sstevel@tonic-gate seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u;
25667c478bd9Sstevel@tonic-gate if (lseek(kmem, (off_t) seek_off, SEEK_SET) == seek_off)
25677c478bd9Sstevel@tonic-gate (void) write(kmem, buf, PSARGSZ);
25687c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_SCO */
25697c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_REUSEARGV
25707c478bd9Sstevel@tonic-gate if (LastArgv == NULL)
25717c478bd9Sstevel@tonic-gate return;
25727c478bd9Sstevel@tonic-gate
25737c478bd9Sstevel@tonic-gate if (i > LastArgv - Argv[0] - 2)
25747c478bd9Sstevel@tonic-gate {
25757c478bd9Sstevel@tonic-gate i = LastArgv - Argv[0] - 2;
25767c478bd9Sstevel@tonic-gate buf[i] = '\0';
25777c478bd9Sstevel@tonic-gate }
25787c478bd9Sstevel@tonic-gate (void) sm_strlcpy(Argv[0], buf, i + 1);
25797c478bd9Sstevel@tonic-gate p = &Argv[0][i];
25807c478bd9Sstevel@tonic-gate while (p < LastArgv)
25817c478bd9Sstevel@tonic-gate *p++ = SPT_PADCHAR;
25827c478bd9Sstevel@tonic-gate Argv[1] = NULL;
25837c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_REUSEARGV */
25847c478bd9Sstevel@tonic-gate # if SPT_TYPE == SPT_CHANGEARGV
25857c478bd9Sstevel@tonic-gate Argv[0] = buf;
25867c478bd9Sstevel@tonic-gate Argv[1] = 0;
25877c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE == SPT_CHANGEARGV */
25887c478bd9Sstevel@tonic-gate # endif /* SPT_TYPE != SPT_NONE */
25897c478bd9Sstevel@tonic-gate }
25907c478bd9Sstevel@tonic-gate
25917c478bd9Sstevel@tonic-gate #endif /* SPT_TYPE != SPT_BUILTIN */
25927c478bd9Sstevel@tonic-gate /*
25937c478bd9Sstevel@tonic-gate ** SM_SETPROCTITLE -- set process task and set process title for ps
25947c478bd9Sstevel@tonic-gate **
25957c478bd9Sstevel@tonic-gate ** Possibly set process status and call setproctitle() to
25967c478bd9Sstevel@tonic-gate ** change the ps display.
25977c478bd9Sstevel@tonic-gate **
25987c478bd9Sstevel@tonic-gate ** Parameters:
25997c478bd9Sstevel@tonic-gate ** status -- whether or not to store as process status
26007c478bd9Sstevel@tonic-gate ** e -- the current envelope.
26017c478bd9Sstevel@tonic-gate ** fmt -- a printf style format string.
26027c478bd9Sstevel@tonic-gate ** a, b, c -- possible parameters to fmt.
26037c478bd9Sstevel@tonic-gate **
26047c478bd9Sstevel@tonic-gate ** Returns:
26057c478bd9Sstevel@tonic-gate ** none.
26067c478bd9Sstevel@tonic-gate */
26077c478bd9Sstevel@tonic-gate
26087c478bd9Sstevel@tonic-gate /*VARARGS2*/
26097c478bd9Sstevel@tonic-gate void
26107c478bd9Sstevel@tonic-gate #ifdef __STDC__
sm_setproctitle(bool status,ENVELOPE * e,const char * fmt,...)26117c478bd9Sstevel@tonic-gate sm_setproctitle(bool status, ENVELOPE *e, const char *fmt, ...)
26127c478bd9Sstevel@tonic-gate #else /* __STDC__ */
26137c478bd9Sstevel@tonic-gate sm_setproctitle(status, e, fmt, va_alist)
26147c478bd9Sstevel@tonic-gate bool status;
26157c478bd9Sstevel@tonic-gate ENVELOPE *e;
26167c478bd9Sstevel@tonic-gate const char *fmt;
26177c478bd9Sstevel@tonic-gate va_dcl
26187c478bd9Sstevel@tonic-gate #endif /* __STDC__ */
26197c478bd9Sstevel@tonic-gate {
26207c478bd9Sstevel@tonic-gate char buf[SPT_BUFSIZE];
26217c478bd9Sstevel@tonic-gate SM_VA_LOCAL_DECL
26227c478bd9Sstevel@tonic-gate
26237c478bd9Sstevel@tonic-gate /* print the argument string */
26247c478bd9Sstevel@tonic-gate SM_VA_START(ap, fmt);
2625058561cbSjbeck (void) sm_vsnprintf(buf, sizeof(buf), fmt, ap);
26267c478bd9Sstevel@tonic-gate SM_VA_END(ap);
26277c478bd9Sstevel@tonic-gate
26287c478bd9Sstevel@tonic-gate if (status)
26297c478bd9Sstevel@tonic-gate proc_list_set(CurrentPid, buf);
26307c478bd9Sstevel@tonic-gate
26317c478bd9Sstevel@tonic-gate if (ProcTitlePrefix != NULL)
26327c478bd9Sstevel@tonic-gate {
26337c478bd9Sstevel@tonic-gate char prefix[SPT_BUFSIZE];
26347c478bd9Sstevel@tonic-gate
2635058561cbSjbeck expand(ProcTitlePrefix, prefix, sizeof(prefix), e);
26367c478bd9Sstevel@tonic-gate setproctitle("%s: %s", prefix, buf);
26377c478bd9Sstevel@tonic-gate }
26387c478bd9Sstevel@tonic-gate else
26397c478bd9Sstevel@tonic-gate setproctitle("%s", buf);
26407c478bd9Sstevel@tonic-gate }
26417c478bd9Sstevel@tonic-gate /*
26427c478bd9Sstevel@tonic-gate ** WAITFOR -- wait for a particular process id.
26437c478bd9Sstevel@tonic-gate **
26447c478bd9Sstevel@tonic-gate ** Parameters:
26457c478bd9Sstevel@tonic-gate ** pid -- process id to wait for.
26467c478bd9Sstevel@tonic-gate **
26477c478bd9Sstevel@tonic-gate ** Returns:
26487c478bd9Sstevel@tonic-gate ** status of pid.
26497c478bd9Sstevel@tonic-gate ** -1 if pid never shows up.
26507c478bd9Sstevel@tonic-gate **
26517c478bd9Sstevel@tonic-gate ** Side Effects:
26527c478bd9Sstevel@tonic-gate ** none.
26537c478bd9Sstevel@tonic-gate */
26547c478bd9Sstevel@tonic-gate
26557c478bd9Sstevel@tonic-gate int
waitfor(pid)26567c478bd9Sstevel@tonic-gate waitfor(pid)
26577c478bd9Sstevel@tonic-gate pid_t pid;
26587c478bd9Sstevel@tonic-gate {
26597c478bd9Sstevel@tonic-gate int st;
26607c478bd9Sstevel@tonic-gate pid_t i;
26617c478bd9Sstevel@tonic-gate
26627c478bd9Sstevel@tonic-gate do
26637c478bd9Sstevel@tonic-gate {
26647c478bd9Sstevel@tonic-gate errno = 0;
26657c478bd9Sstevel@tonic-gate i = sm_wait(&st);
26667c478bd9Sstevel@tonic-gate if (i > 0)
26677c478bd9Sstevel@tonic-gate proc_list_drop(i, st, NULL);
26687c478bd9Sstevel@tonic-gate } while ((i >= 0 || errno == EINTR) && i != pid);
26697c478bd9Sstevel@tonic-gate if (i < 0)
26707c478bd9Sstevel@tonic-gate return -1;
26717c478bd9Sstevel@tonic-gate return st;
26727c478bd9Sstevel@tonic-gate }
26737c478bd9Sstevel@tonic-gate /*
26747c478bd9Sstevel@tonic-gate ** SM_WAIT -- wait
26757c478bd9Sstevel@tonic-gate **
26767c478bd9Sstevel@tonic-gate ** Parameters:
26777c478bd9Sstevel@tonic-gate ** status -- pointer to status (return value)
26787c478bd9Sstevel@tonic-gate **
26797c478bd9Sstevel@tonic-gate ** Returns:
26807c478bd9Sstevel@tonic-gate ** pid
26817c478bd9Sstevel@tonic-gate */
26827c478bd9Sstevel@tonic-gate
26837c478bd9Sstevel@tonic-gate pid_t
sm_wait(status)26847c478bd9Sstevel@tonic-gate sm_wait(status)
26857c478bd9Sstevel@tonic-gate int *status;
26867c478bd9Sstevel@tonic-gate {
26877c478bd9Sstevel@tonic-gate # ifdef WAITUNION
26887c478bd9Sstevel@tonic-gate union wait st;
26897c478bd9Sstevel@tonic-gate # else /* WAITUNION */
26907c478bd9Sstevel@tonic-gate auto int st;
26917c478bd9Sstevel@tonic-gate # endif /* WAITUNION */
26927c478bd9Sstevel@tonic-gate pid_t i;
26937c478bd9Sstevel@tonic-gate # if defined(ISC_UNIX) || defined(_SCO_unix_)
26947c478bd9Sstevel@tonic-gate int savesig;
26957c478bd9Sstevel@tonic-gate # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */
26967c478bd9Sstevel@tonic-gate
26977c478bd9Sstevel@tonic-gate # if defined(ISC_UNIX) || defined(_SCO_unix_)
26987c478bd9Sstevel@tonic-gate savesig = sm_releasesignal(SIGCHLD);
26997c478bd9Sstevel@tonic-gate # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */
27007c478bd9Sstevel@tonic-gate i = wait(&st);
27017c478bd9Sstevel@tonic-gate # if defined(ISC_UNIX) || defined(_SCO_unix_)
27027c478bd9Sstevel@tonic-gate if (savesig > 0)
27037c478bd9Sstevel@tonic-gate sm_blocksignal(SIGCHLD);
27047c478bd9Sstevel@tonic-gate # endif /* defined(ISC_UNIX) || defined(_SCO_unix_) */
27057c478bd9Sstevel@tonic-gate # ifdef WAITUNION
27067c478bd9Sstevel@tonic-gate *status = st.w_status;
27077c478bd9Sstevel@tonic-gate # else /* WAITUNION */
27087c478bd9Sstevel@tonic-gate *status = st;
27097c478bd9Sstevel@tonic-gate # endif /* WAITUNION */
27107c478bd9Sstevel@tonic-gate return i;
27117c478bd9Sstevel@tonic-gate }
27127c478bd9Sstevel@tonic-gate /*
27137c478bd9Sstevel@tonic-gate ** REAPCHILD -- pick up the body of my child, lest it become a zombie
27147c478bd9Sstevel@tonic-gate **
27157c478bd9Sstevel@tonic-gate ** Parameters:
27167c478bd9Sstevel@tonic-gate ** sig -- the signal that got us here (unused).
27177c478bd9Sstevel@tonic-gate **
27187c478bd9Sstevel@tonic-gate ** Returns:
27197c478bd9Sstevel@tonic-gate ** none.
27207c478bd9Sstevel@tonic-gate **
27217c478bd9Sstevel@tonic-gate ** Side Effects:
27227c478bd9Sstevel@tonic-gate ** Picks up extant zombies.
27237c478bd9Sstevel@tonic-gate ** Control socket exits may restart/shutdown daemon.
27247c478bd9Sstevel@tonic-gate **
27257c478bd9Sstevel@tonic-gate ** NOTE: THIS CAN BE CALLED FROM A SIGNAL HANDLER. DO NOT ADD
27267c478bd9Sstevel@tonic-gate ** ANYTHING TO THIS ROUTINE UNLESS YOU KNOW WHAT YOU ARE
27277c478bd9Sstevel@tonic-gate ** DOING.
27287c478bd9Sstevel@tonic-gate */
27297c478bd9Sstevel@tonic-gate
27307c478bd9Sstevel@tonic-gate /* ARGSUSED0 */
27317c478bd9Sstevel@tonic-gate SIGFUNC_DECL
reapchild(sig)27327c478bd9Sstevel@tonic-gate reapchild(sig)
27337c478bd9Sstevel@tonic-gate int sig;
27347c478bd9Sstevel@tonic-gate {
27357c478bd9Sstevel@tonic-gate int save_errno = errno;
27367c478bd9Sstevel@tonic-gate int st;
27377c478bd9Sstevel@tonic-gate pid_t pid;
27387c478bd9Sstevel@tonic-gate # if HASWAITPID
27397c478bd9Sstevel@tonic-gate auto int status;
27407c478bd9Sstevel@tonic-gate int count;
27417c478bd9Sstevel@tonic-gate
27427c478bd9Sstevel@tonic-gate count = 0;
27437c478bd9Sstevel@tonic-gate while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
27447c478bd9Sstevel@tonic-gate {
27457c478bd9Sstevel@tonic-gate st = status;
27467c478bd9Sstevel@tonic-gate if (count++ > 1000)
27477c478bd9Sstevel@tonic-gate break;
27487c478bd9Sstevel@tonic-gate # else /* HASWAITPID */
27497c478bd9Sstevel@tonic-gate # ifdef WNOHANG
27507c478bd9Sstevel@tonic-gate union wait status;
27517c478bd9Sstevel@tonic-gate
27527c478bd9Sstevel@tonic-gate while ((pid = wait3(&status, WNOHANG, (struct rusage *) NULL)) > 0)
27537c478bd9Sstevel@tonic-gate {
27547c478bd9Sstevel@tonic-gate st = status.w_status;
27557c478bd9Sstevel@tonic-gate # else /* WNOHANG */
27567c478bd9Sstevel@tonic-gate auto int status;
27577c478bd9Sstevel@tonic-gate
27587c478bd9Sstevel@tonic-gate /*
27597c478bd9Sstevel@tonic-gate ** Catch one zombie -- we will be re-invoked (we hope) if there
27607c478bd9Sstevel@tonic-gate ** are more. Unreliable signals probably break this, but this
27617c478bd9Sstevel@tonic-gate ** is the "old system" situation -- waitpid or wait3 are to be
27627c478bd9Sstevel@tonic-gate ** strongly preferred.
27637c478bd9Sstevel@tonic-gate */
27647c478bd9Sstevel@tonic-gate
27657c478bd9Sstevel@tonic-gate if ((pid = wait(&status)) > 0)
27667c478bd9Sstevel@tonic-gate {
27677c478bd9Sstevel@tonic-gate st = status;
27687c478bd9Sstevel@tonic-gate # endif /* WNOHANG */
27697c478bd9Sstevel@tonic-gate # endif /* HASWAITPID */
27707c478bd9Sstevel@tonic-gate /* Drop PID and check if it was a control socket child */
27717c478bd9Sstevel@tonic-gate proc_list_drop(pid, st, NULL);
27727c478bd9Sstevel@tonic-gate }
27737c478bd9Sstevel@tonic-gate FIX_SYSV_SIGNAL(sig, reapchild);
27747c478bd9Sstevel@tonic-gate errno = save_errno;
27757c478bd9Sstevel@tonic-gate return SIGFUNC_RETURN;
27767c478bd9Sstevel@tonic-gate }
27777c478bd9Sstevel@tonic-gate /*
27787c478bd9Sstevel@tonic-gate ** GETDTABLESIZE -- return number of file descriptors
27797c478bd9Sstevel@tonic-gate **
27807c478bd9Sstevel@tonic-gate ** Only on non-BSD systems
27817c478bd9Sstevel@tonic-gate **
27827c478bd9Sstevel@tonic-gate ** Parameters:
27837c478bd9Sstevel@tonic-gate ** none
27847c478bd9Sstevel@tonic-gate **
27857c478bd9Sstevel@tonic-gate ** Returns:
27867c478bd9Sstevel@tonic-gate ** size of file descriptor table
27877c478bd9Sstevel@tonic-gate **
27887c478bd9Sstevel@tonic-gate ** Side Effects:
27897c478bd9Sstevel@tonic-gate ** none
27907c478bd9Sstevel@tonic-gate */
27917c478bd9Sstevel@tonic-gate
27927c478bd9Sstevel@tonic-gate #ifdef SOLARIS
27937c478bd9Sstevel@tonic-gate # include <sys/resource.h>
27947c478bd9Sstevel@tonic-gate #endif /* SOLARIS */
27957c478bd9Sstevel@tonic-gate
27967c478bd9Sstevel@tonic-gate int
getdtsize()27977c478bd9Sstevel@tonic-gate getdtsize()
27987c478bd9Sstevel@tonic-gate {
27997c478bd9Sstevel@tonic-gate # ifdef RLIMIT_NOFILE
28007c478bd9Sstevel@tonic-gate struct rlimit rl;
28017c478bd9Sstevel@tonic-gate
28027c478bd9Sstevel@tonic-gate if (getrlimit(RLIMIT_NOFILE, &rl) >= 0)
28037c478bd9Sstevel@tonic-gate return rl.rlim_cur;
28047c478bd9Sstevel@tonic-gate # endif /* RLIMIT_NOFILE */
28057c478bd9Sstevel@tonic-gate
28067c478bd9Sstevel@tonic-gate # if HASGETDTABLESIZE
28077c478bd9Sstevel@tonic-gate return getdtablesize();
28087c478bd9Sstevel@tonic-gate # else /* HASGETDTABLESIZE */
28097c478bd9Sstevel@tonic-gate # ifdef _SC_OPEN_MAX
28107c478bd9Sstevel@tonic-gate return sysconf(_SC_OPEN_MAX);
28117c478bd9Sstevel@tonic-gate # else /* _SC_OPEN_MAX */
28127c478bd9Sstevel@tonic-gate return NOFILE;
28137c478bd9Sstevel@tonic-gate # endif /* _SC_OPEN_MAX */
28147c478bd9Sstevel@tonic-gate # endif /* HASGETDTABLESIZE */
28157c478bd9Sstevel@tonic-gate }
28167c478bd9Sstevel@tonic-gate /*
28177c478bd9Sstevel@tonic-gate ** UNAME -- get the UUCP name of this system.
28187c478bd9Sstevel@tonic-gate */
28197c478bd9Sstevel@tonic-gate
28207c478bd9Sstevel@tonic-gate #if !HASUNAME
28217c478bd9Sstevel@tonic-gate
28227c478bd9Sstevel@tonic-gate int
uname(name)28237c478bd9Sstevel@tonic-gate uname(name)
28247c478bd9Sstevel@tonic-gate struct utsname *name;
28257c478bd9Sstevel@tonic-gate {
28267c478bd9Sstevel@tonic-gate SM_FILE_T *file;
28277c478bd9Sstevel@tonic-gate char *n;
28287c478bd9Sstevel@tonic-gate
28297c478bd9Sstevel@tonic-gate name->nodename[0] = '\0';
28307c478bd9Sstevel@tonic-gate
28317c478bd9Sstevel@tonic-gate /* try /etc/whoami -- one line with the node name */
28327c478bd9Sstevel@tonic-gate if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, "/etc/whoami",
28337c478bd9Sstevel@tonic-gate SM_IO_RDONLY, NULL)) != NULL)
28347c478bd9Sstevel@tonic-gate {
28357c478bd9Sstevel@tonic-gate (void) sm_io_fgets(file, SM_TIME_DEFAULT, name->nodename,
28367c478bd9Sstevel@tonic-gate NODE_LENGTH + 1);
28377c478bd9Sstevel@tonic-gate (void) sm_io_close(file, SM_TIME_DEFAULT);
28387c478bd9Sstevel@tonic-gate n = strchr(name->nodename, '\n');
28397c478bd9Sstevel@tonic-gate if (n != NULL)
28407c478bd9Sstevel@tonic-gate *n = '\0';
28417c478bd9Sstevel@tonic-gate if (name->nodename[0] != '\0')
28427c478bd9Sstevel@tonic-gate return 0;
28437c478bd9Sstevel@tonic-gate }
28447c478bd9Sstevel@tonic-gate
28457c478bd9Sstevel@tonic-gate /* try /usr/include/whoami.h -- has a #define somewhere */
28467c478bd9Sstevel@tonic-gate if ((file = sm_io_open(SmFtStdio, SM_TIME_DEFAULT,
28477c478bd9Sstevel@tonic-gate "/usr/include/whoami.h", SM_IO_RDONLY, NULL))
28487c478bd9Sstevel@tonic-gate != NULL)
28497c478bd9Sstevel@tonic-gate {
28507c478bd9Sstevel@tonic-gate char buf[MAXLINE];
28517c478bd9Sstevel@tonic-gate
28527c478bd9Sstevel@tonic-gate while (sm_io_fgets(file, SM_TIME_DEFAULT,
2853058561cbSjbeck buf, sizeof(buf)) != NULL)
28547c478bd9Sstevel@tonic-gate {
28557c478bd9Sstevel@tonic-gate if (sm_io_sscanf(buf, "#define sysname \"%*[^\"]\"",
28567c478bd9Sstevel@tonic-gate NODE_LENGTH, name->nodename) > 0)
28577c478bd9Sstevel@tonic-gate break;
28587c478bd9Sstevel@tonic-gate }
28597c478bd9Sstevel@tonic-gate (void) sm_io_close(file, SM_TIME_DEFAULT);
28607c478bd9Sstevel@tonic-gate if (name->nodename[0] != '\0')
28617c478bd9Sstevel@tonic-gate return 0;
28627c478bd9Sstevel@tonic-gate }
28637c478bd9Sstevel@tonic-gate
28647c478bd9Sstevel@tonic-gate return -1;
28657c478bd9Sstevel@tonic-gate }
28667c478bd9Sstevel@tonic-gate #endif /* !HASUNAME */
28677c478bd9Sstevel@tonic-gate /*
28687c478bd9Sstevel@tonic-gate ** INITGROUPS -- initialize groups
28697c478bd9Sstevel@tonic-gate **
28707c478bd9Sstevel@tonic-gate ** Stub implementation for System V style systems
28717c478bd9Sstevel@tonic-gate */
28727c478bd9Sstevel@tonic-gate
28737c478bd9Sstevel@tonic-gate #if !HASINITGROUPS
28747c478bd9Sstevel@tonic-gate
initgroups(name,basegid)28757c478bd9Sstevel@tonic-gate initgroups(name, basegid)
28767c478bd9Sstevel@tonic-gate char *name;
28777c478bd9Sstevel@tonic-gate int basegid;
28787c478bd9Sstevel@tonic-gate {
28797c478bd9Sstevel@tonic-gate return 0;
28807c478bd9Sstevel@tonic-gate }
28817c478bd9Sstevel@tonic-gate
28827c478bd9Sstevel@tonic-gate #endif /* !HASINITGROUPS */
28837c478bd9Sstevel@tonic-gate /*
28847c478bd9Sstevel@tonic-gate ** SETGROUPS -- set group list
28857c478bd9Sstevel@tonic-gate **
28867c478bd9Sstevel@tonic-gate ** Stub implementation for systems that don't have group lists
28877c478bd9Sstevel@tonic-gate */
28887c478bd9Sstevel@tonic-gate
28897c478bd9Sstevel@tonic-gate #ifndef NGROUPS_MAX
28907c478bd9Sstevel@tonic-gate
28917c478bd9Sstevel@tonic-gate int
setgroups(ngroups,grouplist)28927c478bd9Sstevel@tonic-gate setgroups(ngroups, grouplist)
28937c478bd9Sstevel@tonic-gate int ngroups;
28947c478bd9Sstevel@tonic-gate GIDSET_T grouplist[];
28957c478bd9Sstevel@tonic-gate {
28967c478bd9Sstevel@tonic-gate return 0;
28977c478bd9Sstevel@tonic-gate }
28987c478bd9Sstevel@tonic-gate
28997c478bd9Sstevel@tonic-gate #endif /* ! NGROUPS_MAX */
29007c478bd9Sstevel@tonic-gate /*
29017c478bd9Sstevel@tonic-gate ** SETSID -- set session id (for non-POSIX systems)
29027c478bd9Sstevel@tonic-gate */
29037c478bd9Sstevel@tonic-gate
29047c478bd9Sstevel@tonic-gate #if !HASSETSID
29057c478bd9Sstevel@tonic-gate
29067c478bd9Sstevel@tonic-gate pid_t
setsid(void)29077c478bd9Sstevel@tonic-gate setsid __P ((void))
29087c478bd9Sstevel@tonic-gate {
29097c478bd9Sstevel@tonic-gate # ifdef TIOCNOTTY
29107c478bd9Sstevel@tonic-gate int fd;
29117c478bd9Sstevel@tonic-gate
29127c478bd9Sstevel@tonic-gate fd = open("/dev/tty", O_RDWR, 0);
29137c478bd9Sstevel@tonic-gate if (fd >= 0)
29147c478bd9Sstevel@tonic-gate {
29157c478bd9Sstevel@tonic-gate (void) ioctl(fd, TIOCNOTTY, (char *) 0);
29167c478bd9Sstevel@tonic-gate (void) close(fd);
29177c478bd9Sstevel@tonic-gate }
29187c478bd9Sstevel@tonic-gate # endif /* TIOCNOTTY */
29197c478bd9Sstevel@tonic-gate # ifdef SYS5SETPGRP
29207c478bd9Sstevel@tonic-gate return setpgrp();
29217c478bd9Sstevel@tonic-gate # else /* SYS5SETPGRP */
29227c478bd9Sstevel@tonic-gate return setpgid(0, CurrentPid);
29237c478bd9Sstevel@tonic-gate # endif /* SYS5SETPGRP */
29247c478bd9Sstevel@tonic-gate }
29257c478bd9Sstevel@tonic-gate
29267c478bd9Sstevel@tonic-gate #endif /* !HASSETSID */
29277c478bd9Sstevel@tonic-gate /*
29287c478bd9Sstevel@tonic-gate ** FSYNC -- dummy fsync
29297c478bd9Sstevel@tonic-gate */
29307c478bd9Sstevel@tonic-gate
29317c478bd9Sstevel@tonic-gate #if NEEDFSYNC
29327c478bd9Sstevel@tonic-gate
fsync(fd)29337c478bd9Sstevel@tonic-gate fsync(fd)
29347c478bd9Sstevel@tonic-gate int fd;
29357c478bd9Sstevel@tonic-gate {
29367c478bd9Sstevel@tonic-gate # ifdef O_SYNC
29377c478bd9Sstevel@tonic-gate return fcntl(fd, F_SETFL, O_SYNC);
29387c478bd9Sstevel@tonic-gate # else /* O_SYNC */
29397c478bd9Sstevel@tonic-gate /* nothing we can do */
29407c478bd9Sstevel@tonic-gate return 0;
29417c478bd9Sstevel@tonic-gate # endif /* O_SYNC */
29427c478bd9Sstevel@tonic-gate }
29437c478bd9Sstevel@tonic-gate
29447c478bd9Sstevel@tonic-gate #endif /* NEEDFSYNC */
29457c478bd9Sstevel@tonic-gate /*
29467c478bd9Sstevel@tonic-gate ** DGUX_INET_ADDR -- inet_addr for DG/UX
29477c478bd9Sstevel@tonic-gate **
29487c478bd9Sstevel@tonic-gate ** Data General DG/UX version of inet_addr returns a struct in_addr
29497c478bd9Sstevel@tonic-gate ** instead of a long. This patches things. Only needed on versions
29507c478bd9Sstevel@tonic-gate ** prior to 5.4.3.
29517c478bd9Sstevel@tonic-gate */
29527c478bd9Sstevel@tonic-gate
29537c478bd9Sstevel@tonic-gate #ifdef DGUX_5_4_2
29547c478bd9Sstevel@tonic-gate
29557c478bd9Sstevel@tonic-gate # undef inet_addr
29567c478bd9Sstevel@tonic-gate
29577c478bd9Sstevel@tonic-gate long
dgux_inet_addr(host)29587c478bd9Sstevel@tonic-gate dgux_inet_addr(host)
29597c478bd9Sstevel@tonic-gate char *host;
29607c478bd9Sstevel@tonic-gate {
29617c478bd9Sstevel@tonic-gate struct in_addr haddr;
29627c478bd9Sstevel@tonic-gate
29637c478bd9Sstevel@tonic-gate haddr = inet_addr(host);
29647c478bd9Sstevel@tonic-gate return haddr.s_addr;
29657c478bd9Sstevel@tonic-gate }
29667c478bd9Sstevel@tonic-gate
29677c478bd9Sstevel@tonic-gate #endif /* DGUX_5_4_2 */
29687c478bd9Sstevel@tonic-gate /*
29697c478bd9Sstevel@tonic-gate ** GETOPT -- for old systems or systems with bogus implementations
29707c478bd9Sstevel@tonic-gate */
29717c478bd9Sstevel@tonic-gate
29727c478bd9Sstevel@tonic-gate #if !SM_CONF_GETOPT
29737c478bd9Sstevel@tonic-gate
29747c478bd9Sstevel@tonic-gate /*
29757c478bd9Sstevel@tonic-gate * Copyright (c) 1985 Regents of the University of California.
29767c478bd9Sstevel@tonic-gate * All rights reserved. The Berkeley software License Agreement
29777c478bd9Sstevel@tonic-gate * specifies the terms and conditions for redistribution.
29787c478bd9Sstevel@tonic-gate */
29797c478bd9Sstevel@tonic-gate
29807c478bd9Sstevel@tonic-gate
29817c478bd9Sstevel@tonic-gate /*
29827c478bd9Sstevel@tonic-gate ** this version hacked to add `atend' flag to allow state machine
29837c478bd9Sstevel@tonic-gate ** to reset if invoked by the program to scan args for a 2nd time
29847c478bd9Sstevel@tonic-gate */
29857c478bd9Sstevel@tonic-gate
29867c478bd9Sstevel@tonic-gate # if defined(LIBC_SCCS) && !defined(lint)
29877c478bd9Sstevel@tonic-gate static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86";
29887c478bd9Sstevel@tonic-gate # endif /* defined(LIBC_SCCS) && !defined(lint) */
29897c478bd9Sstevel@tonic-gate
29907c478bd9Sstevel@tonic-gate /*
29917c478bd9Sstevel@tonic-gate ** get option letter from argument vector
29927c478bd9Sstevel@tonic-gate */
29937c478bd9Sstevel@tonic-gate # ifdef _CONVEX_SOURCE
29947c478bd9Sstevel@tonic-gate extern int optind, opterr, optopt;
29957c478bd9Sstevel@tonic-gate extern char *optarg;
29967c478bd9Sstevel@tonic-gate # else /* _CONVEX_SOURCE */
29977c478bd9Sstevel@tonic-gate int opterr = 1; /* if error message should be printed */
29987c478bd9Sstevel@tonic-gate int optind = 1; /* index into parent argv vector */
29997c478bd9Sstevel@tonic-gate int optopt = 0; /* character checked for validity */
30007c478bd9Sstevel@tonic-gate char *optarg = NULL; /* argument associated with option */
30017c478bd9Sstevel@tonic-gate # endif /* _CONVEX_SOURCE */
30027c478bd9Sstevel@tonic-gate
30037c478bd9Sstevel@tonic-gate # define BADCH (int)'?'
30047c478bd9Sstevel@tonic-gate # define EMSG ""
30057c478bd9Sstevel@tonic-gate # define tell(s) if (opterr) \
30067c478bd9Sstevel@tonic-gate {sm_io_fputs(smioerr, SM_TIME_DEFAULT, *nargv); \
30077c478bd9Sstevel@tonic-gate (void) sm_io_fputs(smioerr, SM_TIME_DEFAULT, s); \
30087c478bd9Sstevel@tonic-gate (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, optopt); \
30097c478bd9Sstevel@tonic-gate (void) sm_io_putc(smioerr, SM_TIME_DEFAULT, '\n'); \
30107c478bd9Sstevel@tonic-gate return BADCH;}
30117c478bd9Sstevel@tonic-gate
30127c478bd9Sstevel@tonic-gate int
getopt(nargc,nargv,ostr)30137c478bd9Sstevel@tonic-gate getopt(nargc,nargv,ostr)
30147c478bd9Sstevel@tonic-gate int nargc;
30157c478bd9Sstevel@tonic-gate char *const *nargv;
30167c478bd9Sstevel@tonic-gate const char *ostr;
30177c478bd9Sstevel@tonic-gate {
30187c478bd9Sstevel@tonic-gate static char *place = EMSG; /* option letter processing */
30197c478bd9Sstevel@tonic-gate static char atend = 0;
30207c478bd9Sstevel@tonic-gate register char *oli = NULL; /* option letter list index */
30217c478bd9Sstevel@tonic-gate
30227c478bd9Sstevel@tonic-gate if (atend) {
30237c478bd9Sstevel@tonic-gate atend = 0;
30247c478bd9Sstevel@tonic-gate place = EMSG;
30257c478bd9Sstevel@tonic-gate }
30267c478bd9Sstevel@tonic-gate if(!*place) { /* update scanning pointer */
30277c478bd9Sstevel@tonic-gate if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) {
30287c478bd9Sstevel@tonic-gate atend++;
30297c478bd9Sstevel@tonic-gate return -1;
30307c478bd9Sstevel@tonic-gate }
30317c478bd9Sstevel@tonic-gate if (*place == '-') { /* found "--" */
30327c478bd9Sstevel@tonic-gate ++optind;
30337c478bd9Sstevel@tonic-gate atend++;
30347c478bd9Sstevel@tonic-gate return -1;
30357c478bd9Sstevel@tonic-gate }
30367c478bd9Sstevel@tonic-gate } /* option letter okay? */
30377c478bd9Sstevel@tonic-gate if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr,optopt))) {
30387c478bd9Sstevel@tonic-gate if (!*place) ++optind;
30397c478bd9Sstevel@tonic-gate tell(": illegal option -- ");
30407c478bd9Sstevel@tonic-gate }
30417c478bd9Sstevel@tonic-gate if (oli && *++oli != ':') { /* don't need argument */
30427c478bd9Sstevel@tonic-gate optarg = NULL;
30437c478bd9Sstevel@tonic-gate if (!*place) ++optind;
30447c478bd9Sstevel@tonic-gate }
30457c478bd9Sstevel@tonic-gate else { /* need an argument */
30467c478bd9Sstevel@tonic-gate if (*place) optarg = place; /* no white space */
30477c478bd9Sstevel@tonic-gate else if (nargc <= ++optind) { /* no arg */
30487c478bd9Sstevel@tonic-gate place = EMSG;
30497c478bd9Sstevel@tonic-gate tell(": option requires an argument -- ");
30507c478bd9Sstevel@tonic-gate }
30517c478bd9Sstevel@tonic-gate else optarg = nargv[optind]; /* white space */
30527c478bd9Sstevel@tonic-gate place = EMSG;
30537c478bd9Sstevel@tonic-gate ++optind;
30547c478bd9Sstevel@tonic-gate }
30557c478bd9Sstevel@tonic-gate return optopt; /* dump back option letter */
30567c478bd9Sstevel@tonic-gate }
30577c478bd9Sstevel@tonic-gate
30587c478bd9Sstevel@tonic-gate #endif /* !SM_CONF_GETOPT */
30597c478bd9Sstevel@tonic-gate /*
30607c478bd9Sstevel@tonic-gate ** USERSHELLOK -- tell if a user's shell is ok for unrestricted use
30617c478bd9Sstevel@tonic-gate **
30627c478bd9Sstevel@tonic-gate ** Parameters:
30637c478bd9Sstevel@tonic-gate ** user -- the name of the user we are checking.
30647c478bd9Sstevel@tonic-gate ** shell -- the user's shell from /etc/passwd
30657c478bd9Sstevel@tonic-gate **
30667c478bd9Sstevel@tonic-gate ** Returns:
30677c478bd9Sstevel@tonic-gate ** true -- if it is ok to use this for unrestricted access.
30687c478bd9Sstevel@tonic-gate ** false -- if the shell is restricted.
30697c478bd9Sstevel@tonic-gate */
30707c478bd9Sstevel@tonic-gate
30717c478bd9Sstevel@tonic-gate #if !HASGETUSERSHELL
30727c478bd9Sstevel@tonic-gate
30737c478bd9Sstevel@tonic-gate # ifndef _PATH_SHELLS
30747c478bd9Sstevel@tonic-gate # define _PATH_SHELLS "/etc/shells"
30757c478bd9Sstevel@tonic-gate # endif /* ! _PATH_SHELLS */
30767c478bd9Sstevel@tonic-gate
30777c478bd9Sstevel@tonic-gate # if defined(_AIX3) || defined(_AIX4)
30787c478bd9Sstevel@tonic-gate # include <userconf.h>
30797c478bd9Sstevel@tonic-gate # if _AIX4 >= 40200
30807c478bd9Sstevel@tonic-gate # include <userpw.h>
30817c478bd9Sstevel@tonic-gate # endif /* _AIX4 >= 40200 */
30827c478bd9Sstevel@tonic-gate # include <usersec.h>
30837c478bd9Sstevel@tonic-gate # endif /* defined(_AIX3) || defined(_AIX4) */
30847c478bd9Sstevel@tonic-gate
30857c478bd9Sstevel@tonic-gate static char *DefaultUserShells[] =
30867c478bd9Sstevel@tonic-gate {
30877c478bd9Sstevel@tonic-gate "/bin/sh", /* standard shell */
30887c478bd9Sstevel@tonic-gate # ifdef MPE
30897c478bd9Sstevel@tonic-gate "/SYS/PUB/CI",
30907c478bd9Sstevel@tonic-gate # else /* MPE */
30917c478bd9Sstevel@tonic-gate "/usr/bin/sh",
30927c478bd9Sstevel@tonic-gate "/bin/csh", /* C shell */
30937c478bd9Sstevel@tonic-gate "/usr/bin/csh",
30947c478bd9Sstevel@tonic-gate # endif /* MPE */
30957c478bd9Sstevel@tonic-gate # ifdef __hpux
30967c478bd9Sstevel@tonic-gate # ifdef V4FS
30977c478bd9Sstevel@tonic-gate "/usr/bin/rsh", /* restricted Bourne shell */
30987c478bd9Sstevel@tonic-gate "/usr/bin/ksh", /* Korn shell */
30997c478bd9Sstevel@tonic-gate "/usr/bin/rksh", /* restricted Korn shell */
31007c478bd9Sstevel@tonic-gate "/usr/bin/pam",
31017c478bd9Sstevel@tonic-gate "/usr/bin/keysh", /* key shell (extended Korn shell) */
31027c478bd9Sstevel@tonic-gate "/usr/bin/posix/sh",
31037c478bd9Sstevel@tonic-gate # else /* V4FS */
31047c478bd9Sstevel@tonic-gate "/bin/rsh", /* restricted Bourne shell */
31057c478bd9Sstevel@tonic-gate "/bin/ksh", /* Korn shell */
31067c478bd9Sstevel@tonic-gate "/bin/rksh", /* restricted Korn shell */
31077c478bd9Sstevel@tonic-gate "/bin/pam",
31087c478bd9Sstevel@tonic-gate "/usr/bin/keysh", /* key shell (extended Korn shell) */
31097c478bd9Sstevel@tonic-gate "/bin/posix/sh",
31107c478bd9Sstevel@tonic-gate "/sbin/sh",
31117c478bd9Sstevel@tonic-gate # endif /* V4FS */
31127c478bd9Sstevel@tonic-gate # endif /* __hpux */
31137c478bd9Sstevel@tonic-gate # if defined(_AIX3) || defined(_AIX4)
31147c478bd9Sstevel@tonic-gate "/bin/ksh", /* Korn shell */
31157c478bd9Sstevel@tonic-gate "/usr/bin/ksh",
31167c478bd9Sstevel@tonic-gate "/bin/tsh", /* trusted shell */
31177c478bd9Sstevel@tonic-gate "/usr/bin/tsh",
31187c478bd9Sstevel@tonic-gate "/bin/bsh", /* Bourne shell */
31197c478bd9Sstevel@tonic-gate "/usr/bin/bsh",
31207c478bd9Sstevel@tonic-gate # endif /* defined(_AIX3) || defined(_AIX4) */
31217c478bd9Sstevel@tonic-gate # if defined(__svr4__) || defined(__svr5__)
31227c478bd9Sstevel@tonic-gate "/bin/ksh", /* Korn shell */
31237c478bd9Sstevel@tonic-gate "/usr/bin/ksh",
31247c478bd9Sstevel@tonic-gate # endif /* defined(__svr4__) || defined(__svr5__) */
31257c478bd9Sstevel@tonic-gate # ifdef sgi
31267c478bd9Sstevel@tonic-gate "/sbin/sh", /* SGI's shells really live in /sbin */
31277c478bd9Sstevel@tonic-gate "/usr/bin/sh",
31287c478bd9Sstevel@tonic-gate "/sbin/bsh", /* classic Bourne shell */
31297c478bd9Sstevel@tonic-gate "/bin/bsh",
31307c478bd9Sstevel@tonic-gate "/usr/bin/bsh",
31317c478bd9Sstevel@tonic-gate "/sbin/csh", /* standard csh */
31327c478bd9Sstevel@tonic-gate "/bin/csh",
31337c478bd9Sstevel@tonic-gate "/usr/bin/csh",
31347c478bd9Sstevel@tonic-gate "/sbin/jsh", /* classic Bourne shell w/ job control*/
31357c478bd9Sstevel@tonic-gate "/bin/jsh",
31367c478bd9Sstevel@tonic-gate "/usr/bin/jsh",
31377c478bd9Sstevel@tonic-gate "/bin/ksh", /* Korn shell */
31387c478bd9Sstevel@tonic-gate "/sbin/ksh",
31397c478bd9Sstevel@tonic-gate "/usr/bin/ksh",
31407c478bd9Sstevel@tonic-gate "/sbin/tcsh", /* Extended csh */
31417c478bd9Sstevel@tonic-gate "/bin/tcsh",
31427c478bd9Sstevel@tonic-gate "/usr/bin/tcsh",
31437c478bd9Sstevel@tonic-gate # endif /* sgi */
31447c478bd9Sstevel@tonic-gate NULL
31457c478bd9Sstevel@tonic-gate };
31467c478bd9Sstevel@tonic-gate
31477c478bd9Sstevel@tonic-gate #endif /* !HASGETUSERSHELL */
31487c478bd9Sstevel@tonic-gate
31497c478bd9Sstevel@tonic-gate #define WILDCARD_SHELL "/SENDMAIL/ANY/SHELL/"
31507c478bd9Sstevel@tonic-gate
31517c478bd9Sstevel@tonic-gate bool
usershellok(user,shell)31527c478bd9Sstevel@tonic-gate usershellok(user, shell)
31537c478bd9Sstevel@tonic-gate char *user;
31547c478bd9Sstevel@tonic-gate char *shell;
31557c478bd9Sstevel@tonic-gate {
31567c478bd9Sstevel@tonic-gate # if HASGETUSERSHELL
31577c478bd9Sstevel@tonic-gate register char *p;
31587c478bd9Sstevel@tonic-gate extern char *getusershell();
31597c478bd9Sstevel@tonic-gate
31607c478bd9Sstevel@tonic-gate if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') ||
31617c478bd9Sstevel@tonic-gate ConfigLevel <= 1)
31627c478bd9Sstevel@tonic-gate return true;
31637c478bd9Sstevel@tonic-gate
31647c478bd9Sstevel@tonic-gate setusershell();
31657c478bd9Sstevel@tonic-gate while ((p = getusershell()) != NULL)
31667c478bd9Sstevel@tonic-gate if (strcmp(p, shell) == 0 || strcmp(p, WILDCARD_SHELL) == 0)
31677c478bd9Sstevel@tonic-gate break;
31687c478bd9Sstevel@tonic-gate endusershell();
31697c478bd9Sstevel@tonic-gate return p != NULL;
31707c478bd9Sstevel@tonic-gate # else /* HASGETUSERSHELL */
31717c478bd9Sstevel@tonic-gate # if USEGETCONFATTR
31727c478bd9Sstevel@tonic-gate auto char *v;
31737c478bd9Sstevel@tonic-gate # endif /* USEGETCONFATTR */
31747c478bd9Sstevel@tonic-gate register SM_FILE_T *shellf;
31757c478bd9Sstevel@tonic-gate char buf[MAXLINE];
31767c478bd9Sstevel@tonic-gate
31777c478bd9Sstevel@tonic-gate if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') ||
31787c478bd9Sstevel@tonic-gate ConfigLevel <= 1)
31797c478bd9Sstevel@tonic-gate return true;
31807c478bd9Sstevel@tonic-gate
31817c478bd9Sstevel@tonic-gate # if USEGETCONFATTR
31827c478bd9Sstevel@tonic-gate /*
31837c478bd9Sstevel@tonic-gate ** Naturally IBM has a "better" idea.....
31847c478bd9Sstevel@tonic-gate **
31857c478bd9Sstevel@tonic-gate ** What a crock. This interface isn't documented, it is
31867c478bd9Sstevel@tonic-gate ** considered part of the security library (-ls), and it
31877c478bd9Sstevel@tonic-gate ** only works if you are running as root (since the list
31887c478bd9Sstevel@tonic-gate ** of valid shells is obviously a source of great concern).
31897c478bd9Sstevel@tonic-gate ** I recommend that you do NOT define USEGETCONFATTR,
31907c478bd9Sstevel@tonic-gate ** especially since you are going to have to set up an
31917c478bd9Sstevel@tonic-gate ** /etc/shells anyhow to handle the cases where getconfattr
31927c478bd9Sstevel@tonic-gate ** fails.
31937c478bd9Sstevel@tonic-gate */
31947c478bd9Sstevel@tonic-gate
31957c478bd9Sstevel@tonic-gate if (getconfattr(SC_SYS_LOGIN, SC_SHELLS, &v, SEC_LIST) == 0 && v != NULL)
31967c478bd9Sstevel@tonic-gate {
31977c478bd9Sstevel@tonic-gate while (*v != '\0')
31987c478bd9Sstevel@tonic-gate {
31997c478bd9Sstevel@tonic-gate if (strcmp(v, shell) == 0 || strcmp(v, WILDCARD_SHELL) == 0)
32007c478bd9Sstevel@tonic-gate return true;
32017c478bd9Sstevel@tonic-gate v += strlen(v) + 1;
32027c478bd9Sstevel@tonic-gate }
32037c478bd9Sstevel@tonic-gate return false;
32047c478bd9Sstevel@tonic-gate }
32057c478bd9Sstevel@tonic-gate # endif /* USEGETCONFATTR */
32067c478bd9Sstevel@tonic-gate
32077c478bd9Sstevel@tonic-gate shellf = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, _PATH_SHELLS,
32087c478bd9Sstevel@tonic-gate SM_IO_RDONLY, NULL);
32097c478bd9Sstevel@tonic-gate if (shellf == NULL)
32107c478bd9Sstevel@tonic-gate {
32117c478bd9Sstevel@tonic-gate /* no /etc/shells; see if it is one of the std shells */
32127c478bd9Sstevel@tonic-gate char **d;
32137c478bd9Sstevel@tonic-gate
32147c478bd9Sstevel@tonic-gate if (errno != ENOENT && LogLevel > 3)
32157c478bd9Sstevel@tonic-gate sm_syslog(LOG_ERR, NOQID,
32167c478bd9Sstevel@tonic-gate "usershellok: cannot open %s: %s",
32177c478bd9Sstevel@tonic-gate _PATH_SHELLS, sm_errstring(errno));
32187c478bd9Sstevel@tonic-gate
32197c478bd9Sstevel@tonic-gate for (d = DefaultUserShells; *d != NULL; d++)
32207c478bd9Sstevel@tonic-gate {
32217c478bd9Sstevel@tonic-gate if (strcmp(shell, *d) == 0)
32227c478bd9Sstevel@tonic-gate return true;
32237c478bd9Sstevel@tonic-gate }
32247c478bd9Sstevel@tonic-gate return false;
32257c478bd9Sstevel@tonic-gate }
32267c478bd9Sstevel@tonic-gate
3227058561cbSjbeck while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
32287c478bd9Sstevel@tonic-gate {
32297c478bd9Sstevel@tonic-gate register char *p, *q;
32307c478bd9Sstevel@tonic-gate
32317c478bd9Sstevel@tonic-gate p = buf;
32327c478bd9Sstevel@tonic-gate while (*p != '\0' && *p != '#' && *p != '/')
32337c478bd9Sstevel@tonic-gate p++;
32347c478bd9Sstevel@tonic-gate if (*p == '#' || *p == '\0')
32357c478bd9Sstevel@tonic-gate continue;
32367c478bd9Sstevel@tonic-gate q = p;
32377c478bd9Sstevel@tonic-gate while (*p != '\0' && *p != '#' && !(isascii(*p) && isspace(*p)))
32387c478bd9Sstevel@tonic-gate p++;
32397c478bd9Sstevel@tonic-gate *p = '\0';
32407c478bd9Sstevel@tonic-gate if (strcmp(shell, q) == 0 || strcmp(WILDCARD_SHELL, q) == 0)
32417c478bd9Sstevel@tonic-gate {
32427c478bd9Sstevel@tonic-gate (void) sm_io_close(shellf, SM_TIME_DEFAULT);
32437c478bd9Sstevel@tonic-gate return true;
32447c478bd9Sstevel@tonic-gate }
32457c478bd9Sstevel@tonic-gate }
32467c478bd9Sstevel@tonic-gate (void) sm_io_close(shellf, SM_TIME_DEFAULT);
32477c478bd9Sstevel@tonic-gate return false;
32487c478bd9Sstevel@tonic-gate # endif /* HASGETUSERSHELL */
32497c478bd9Sstevel@tonic-gate }
32507c478bd9Sstevel@tonic-gate /*
32517c478bd9Sstevel@tonic-gate ** FREEDISKSPACE -- see how much free space is on the queue filesystem
32527c478bd9Sstevel@tonic-gate **
32537c478bd9Sstevel@tonic-gate ** Only implemented if you have statfs.
32547c478bd9Sstevel@tonic-gate **
32557c478bd9Sstevel@tonic-gate ** Parameters:
32567c478bd9Sstevel@tonic-gate ** dir -- the directory in question.
32577c478bd9Sstevel@tonic-gate ** bsize -- a variable into which the filesystem
32587c478bd9Sstevel@tonic-gate ** block size is stored.
32597c478bd9Sstevel@tonic-gate **
32607c478bd9Sstevel@tonic-gate ** Returns:
32617c478bd9Sstevel@tonic-gate ** The number of blocks free on the queue filesystem.
32627c478bd9Sstevel@tonic-gate ** -1 if the statfs call fails.
32637c478bd9Sstevel@tonic-gate **
32647c478bd9Sstevel@tonic-gate ** Side effects:
32657c478bd9Sstevel@tonic-gate ** Puts the filesystem block size into bsize.
32667c478bd9Sstevel@tonic-gate */
32677c478bd9Sstevel@tonic-gate
32687c478bd9Sstevel@tonic-gate /* statfs types */
32697c478bd9Sstevel@tonic-gate # define SFS_NONE 0 /* no statfs implementation */
32707c478bd9Sstevel@tonic-gate # define SFS_USTAT 1 /* use ustat */
32717c478bd9Sstevel@tonic-gate # define SFS_4ARGS 2 /* use four-argument statfs call */
32727c478bd9Sstevel@tonic-gate # define SFS_VFS 3 /* use <sys/vfs.h> implementation */
32737c478bd9Sstevel@tonic-gate # define SFS_MOUNT 4 /* use <sys/mount.h> implementation */
32747c478bd9Sstevel@tonic-gate # define SFS_STATFS 5 /* use <sys/statfs.h> implementation */
32757c478bd9Sstevel@tonic-gate # define SFS_STATVFS 6 /* use <sys/statvfs.h> implementation */
32767c478bd9Sstevel@tonic-gate
32777c478bd9Sstevel@tonic-gate # ifndef SFS_TYPE
32787c478bd9Sstevel@tonic-gate # define SFS_TYPE SFS_NONE
32797c478bd9Sstevel@tonic-gate # endif /* ! SFS_TYPE */
32807c478bd9Sstevel@tonic-gate
32817c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_USTAT
32827c478bd9Sstevel@tonic-gate # include <ustat.h>
32837c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_USTAT */
32847c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS
32857c478bd9Sstevel@tonic-gate # include <sys/statfs.h>
32867c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_4ARGS || SFS_TYPE == SFS_STATFS */
32877c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_VFS
32887c478bd9Sstevel@tonic-gate # include <sys/vfs.h>
32897c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_VFS */
32907c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_MOUNT
32917c478bd9Sstevel@tonic-gate # include <sys/mount.h>
32927c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_MOUNT */
32937c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_STATVFS
32947c478bd9Sstevel@tonic-gate # include <sys/statvfs.h>
32957c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_STATVFS */
32967c478bd9Sstevel@tonic-gate
32977c478bd9Sstevel@tonic-gate long
freediskspace(dir,bsize)32987c478bd9Sstevel@tonic-gate freediskspace(dir, bsize)
3299058561cbSjbeck const char *dir;
33007c478bd9Sstevel@tonic-gate long *bsize;
33017c478bd9Sstevel@tonic-gate {
33027c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_NONE
33037c478bd9Sstevel@tonic-gate if (bsize != NULL)
33047c478bd9Sstevel@tonic-gate *bsize = 4096L;
33057c478bd9Sstevel@tonic-gate
33067c478bd9Sstevel@tonic-gate /* assume free space is plentiful */
33077c478bd9Sstevel@tonic-gate return (long) LONG_MAX;
33087c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_NONE */
33097c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_USTAT
33107c478bd9Sstevel@tonic-gate struct ustat fs;
33117c478bd9Sstevel@tonic-gate struct stat statbuf;
33127c478bd9Sstevel@tonic-gate # define FSBLOCKSIZE DEV_BSIZE
33137c478bd9Sstevel@tonic-gate # define SFS_BAVAIL f_tfree
33147c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_USTAT */
33157c478bd9Sstevel@tonic-gate # if defined(ultrix)
33167c478bd9Sstevel@tonic-gate struct fs_data fs;
33177c478bd9Sstevel@tonic-gate # define SFS_BAVAIL fd_bfreen
33187c478bd9Sstevel@tonic-gate # define FSBLOCKSIZE 1024L
33197c478bd9Sstevel@tonic-gate # else /* defined(ultrix) */
33207c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_STATVFS
33217c478bd9Sstevel@tonic-gate struct statvfs fs;
33227c478bd9Sstevel@tonic-gate # define FSBLOCKSIZE fs.f_frsize
33237c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_STATVFS */
33247c478bd9Sstevel@tonic-gate struct statfs fs;
33257c478bd9Sstevel@tonic-gate # define FSBLOCKSIZE fs.f_bsize
33267c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_STATVFS */
33277c478bd9Sstevel@tonic-gate # endif /* defined(ultrix) */
33287c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_USTAT */
33297c478bd9Sstevel@tonic-gate # ifndef SFS_BAVAIL
33307c478bd9Sstevel@tonic-gate # define SFS_BAVAIL f_bavail
33317c478bd9Sstevel@tonic-gate # endif /* ! SFS_BAVAIL */
33327c478bd9Sstevel@tonic-gate
33337c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_USTAT
33347c478bd9Sstevel@tonic-gate if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0)
33357c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_USTAT */
33367c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_4ARGS
3337058561cbSjbeck if (statfs(dir, &fs, sizeof(fs), 0) == 0)
33387c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_4ARGS */
33397c478bd9Sstevel@tonic-gate # if SFS_TYPE == SFS_STATVFS
33407c478bd9Sstevel@tonic-gate if (statvfs(dir, &fs) == 0)
33417c478bd9Sstevel@tonic-gate # else /* SFS_TYPE == SFS_STATVFS */
33427c478bd9Sstevel@tonic-gate # if defined(ultrix)
33437c478bd9Sstevel@tonic-gate if (statfs(dir, &fs) > 0)
33447c478bd9Sstevel@tonic-gate # else /* defined(ultrix) */
33457c478bd9Sstevel@tonic-gate if (statfs(dir, &fs) == 0)
33467c478bd9Sstevel@tonic-gate # endif /* defined(ultrix) */
33477c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_STATVFS */
33487c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_4ARGS */
33497c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_USTAT */
33507c478bd9Sstevel@tonic-gate {
33517c478bd9Sstevel@tonic-gate if (bsize != NULL)
33527c478bd9Sstevel@tonic-gate *bsize = FSBLOCKSIZE;
33537c478bd9Sstevel@tonic-gate if (fs.SFS_BAVAIL <= 0)
33547c478bd9Sstevel@tonic-gate return 0;
33557c478bd9Sstevel@tonic-gate else if (fs.SFS_BAVAIL > LONG_MAX)
33567c478bd9Sstevel@tonic-gate return (long) LONG_MAX;
33577c478bd9Sstevel@tonic-gate else
33587c478bd9Sstevel@tonic-gate return (long) fs.SFS_BAVAIL;
33597c478bd9Sstevel@tonic-gate }
33607c478bd9Sstevel@tonic-gate return -1;
33617c478bd9Sstevel@tonic-gate # endif /* SFS_TYPE == SFS_NONE */
33627c478bd9Sstevel@tonic-gate }
33637c478bd9Sstevel@tonic-gate /*
33647c478bd9Sstevel@tonic-gate ** ENOUGHDISKSPACE -- is there enough free space on the queue file systems?
33657c478bd9Sstevel@tonic-gate **
33667c478bd9Sstevel@tonic-gate ** Parameters:
33677c478bd9Sstevel@tonic-gate ** msize -- the size to check against. If zero, we don't yet
33687c478bd9Sstevel@tonic-gate ** know how big the message will be, so just check for
33697c478bd9Sstevel@tonic-gate ** a "reasonable" amount.
33707c478bd9Sstevel@tonic-gate ** e -- envelope, or NULL -- controls logging
33717c478bd9Sstevel@tonic-gate **
33727c478bd9Sstevel@tonic-gate ** Returns:
33737c478bd9Sstevel@tonic-gate ** true if in every queue group there is at least one
33747c478bd9Sstevel@tonic-gate ** queue directory whose file system contains enough free space.
33757c478bd9Sstevel@tonic-gate ** false otherwise.
33767c478bd9Sstevel@tonic-gate **
33777c478bd9Sstevel@tonic-gate ** Side Effects:
33787c478bd9Sstevel@tonic-gate ** If there is not enough disk space and e != NULL
33797c478bd9Sstevel@tonic-gate ** then sm_syslog is called.
33807c478bd9Sstevel@tonic-gate */
33817c478bd9Sstevel@tonic-gate
33827c478bd9Sstevel@tonic-gate bool
enoughdiskspace(msize,e)33837c478bd9Sstevel@tonic-gate enoughdiskspace(msize, e)
33847c478bd9Sstevel@tonic-gate long msize;
33857c478bd9Sstevel@tonic-gate ENVELOPE *e;
33867c478bd9Sstevel@tonic-gate {
33877c478bd9Sstevel@tonic-gate int i;
33887c478bd9Sstevel@tonic-gate
3389*e9af4bc0SJohn Beck #if _FFR_TESTS
3390*e9af4bc0SJohn Beck if (tTd(4, 101))
3391*e9af4bc0SJohn Beck return false;
3392*e9af4bc0SJohn Beck #endif /* _FFR_TESTS */
33937c478bd9Sstevel@tonic-gate if (MinBlocksFree <= 0 && msize <= 0)
33947c478bd9Sstevel@tonic-gate {
33957c478bd9Sstevel@tonic-gate if (tTd(4, 80))
33967c478bd9Sstevel@tonic-gate sm_dprintf("enoughdiskspace: no threshold\n");
33977c478bd9Sstevel@tonic-gate return true;
33987c478bd9Sstevel@tonic-gate }
33997c478bd9Sstevel@tonic-gate
34007c478bd9Sstevel@tonic-gate filesys_update();
34017c478bd9Sstevel@tonic-gate for (i = 0; i < NumQueue; ++i)
34027c478bd9Sstevel@tonic-gate {
34037c478bd9Sstevel@tonic-gate if (pickqdir(Queue[i], msize, e) < 0)
34047c478bd9Sstevel@tonic-gate return false;
34057c478bd9Sstevel@tonic-gate }
34067c478bd9Sstevel@tonic-gate return true;
34077c478bd9Sstevel@tonic-gate }
34087c478bd9Sstevel@tonic-gate /*
34097c478bd9Sstevel@tonic-gate ** TRANSIENTERROR -- tell if an error code indicates a transient failure
34107c478bd9Sstevel@tonic-gate **
34117c478bd9Sstevel@tonic-gate ** This looks at an errno value and tells if this is likely to
34127c478bd9Sstevel@tonic-gate ** go away if retried later.
34137c478bd9Sstevel@tonic-gate **
34147c478bd9Sstevel@tonic-gate ** Parameters:
34157c478bd9Sstevel@tonic-gate ** err -- the errno code to classify.
34167c478bd9Sstevel@tonic-gate **
34177c478bd9Sstevel@tonic-gate ** Returns:
34187c478bd9Sstevel@tonic-gate ** true if this is probably transient.
34197c478bd9Sstevel@tonic-gate ** false otherwise.
34207c478bd9Sstevel@tonic-gate */
34217c478bd9Sstevel@tonic-gate
34227c478bd9Sstevel@tonic-gate bool
transienterror(err)34237c478bd9Sstevel@tonic-gate transienterror(err)
34247c478bd9Sstevel@tonic-gate int err;
34257c478bd9Sstevel@tonic-gate {
34267c478bd9Sstevel@tonic-gate switch (err)
34277c478bd9Sstevel@tonic-gate {
34287c478bd9Sstevel@tonic-gate case EIO: /* I/O error */
34297c478bd9Sstevel@tonic-gate case ENXIO: /* Device not configured */
34307c478bd9Sstevel@tonic-gate case EAGAIN: /* Resource temporarily unavailable */
34317c478bd9Sstevel@tonic-gate case ENOMEM: /* Cannot allocate memory */
34327c478bd9Sstevel@tonic-gate case ENODEV: /* Operation not supported by device */
34337c478bd9Sstevel@tonic-gate case ENFILE: /* Too many open files in system */
34347c478bd9Sstevel@tonic-gate case EMFILE: /* Too many open files */
34357c478bd9Sstevel@tonic-gate case ENOSPC: /* No space left on device */
34367c478bd9Sstevel@tonic-gate case ETIMEDOUT: /* Connection timed out */
34377c478bd9Sstevel@tonic-gate #ifdef ESTALE
34387c478bd9Sstevel@tonic-gate case ESTALE: /* Stale NFS file handle */
34397c478bd9Sstevel@tonic-gate #endif /* ESTALE */
34407c478bd9Sstevel@tonic-gate #ifdef ENETDOWN
34417c478bd9Sstevel@tonic-gate case ENETDOWN: /* Network is down */
34427c478bd9Sstevel@tonic-gate #endif /* ENETDOWN */
34437c478bd9Sstevel@tonic-gate #ifdef ENETUNREACH
34447c478bd9Sstevel@tonic-gate case ENETUNREACH: /* Network is unreachable */
34457c478bd9Sstevel@tonic-gate #endif /* ENETUNREACH */
34467c478bd9Sstevel@tonic-gate #ifdef ENETRESET
34477c478bd9Sstevel@tonic-gate case ENETRESET: /* Network dropped connection on reset */
34487c478bd9Sstevel@tonic-gate #endif /* ENETRESET */
34497c478bd9Sstevel@tonic-gate #ifdef ECONNABORTED
34507c478bd9Sstevel@tonic-gate case ECONNABORTED: /* Software caused connection abort */
34517c478bd9Sstevel@tonic-gate #endif /* ECONNABORTED */
34527c478bd9Sstevel@tonic-gate #ifdef ECONNRESET
34537c478bd9Sstevel@tonic-gate case ECONNRESET: /* Connection reset by peer */
34547c478bd9Sstevel@tonic-gate #endif /* ECONNRESET */
34557c478bd9Sstevel@tonic-gate #ifdef ENOBUFS
34567c478bd9Sstevel@tonic-gate case ENOBUFS: /* No buffer space available */
34577c478bd9Sstevel@tonic-gate #endif /* ENOBUFS */
34587c478bd9Sstevel@tonic-gate #ifdef ESHUTDOWN
34597c478bd9Sstevel@tonic-gate case ESHUTDOWN: /* Can't send after socket shutdown */
34607c478bd9Sstevel@tonic-gate #endif /* ESHUTDOWN */
34617c478bd9Sstevel@tonic-gate #ifdef ECONNREFUSED
34627c478bd9Sstevel@tonic-gate case ECONNREFUSED: /* Connection refused */
34637c478bd9Sstevel@tonic-gate #endif /* ECONNREFUSED */
34647c478bd9Sstevel@tonic-gate #ifdef EHOSTDOWN
34657c478bd9Sstevel@tonic-gate case EHOSTDOWN: /* Host is down */
34667c478bd9Sstevel@tonic-gate #endif /* EHOSTDOWN */
34677c478bd9Sstevel@tonic-gate #ifdef EHOSTUNREACH
34687c478bd9Sstevel@tonic-gate case EHOSTUNREACH: /* No route to host */
34697c478bd9Sstevel@tonic-gate #endif /* EHOSTUNREACH */
34707c478bd9Sstevel@tonic-gate #ifdef EDQUOT
34717c478bd9Sstevel@tonic-gate case EDQUOT: /* Disc quota exceeded */
34727c478bd9Sstevel@tonic-gate #endif /* EDQUOT */
34737c478bd9Sstevel@tonic-gate #ifdef EPROCLIM
34747c478bd9Sstevel@tonic-gate case EPROCLIM: /* Too many processes */
34757c478bd9Sstevel@tonic-gate #endif /* EPROCLIM */
34767c478bd9Sstevel@tonic-gate #ifdef EUSERS
34777c478bd9Sstevel@tonic-gate case EUSERS: /* Too many users */
34787c478bd9Sstevel@tonic-gate #endif /* EUSERS */
34797c478bd9Sstevel@tonic-gate #ifdef EDEADLK
34807c478bd9Sstevel@tonic-gate case EDEADLK: /* Resource deadlock avoided */
34817c478bd9Sstevel@tonic-gate #endif /* EDEADLK */
34827c478bd9Sstevel@tonic-gate #ifdef EISCONN
34837c478bd9Sstevel@tonic-gate case EISCONN: /* Socket already connected */
34847c478bd9Sstevel@tonic-gate #endif /* EISCONN */
34857c478bd9Sstevel@tonic-gate #ifdef EINPROGRESS
34867c478bd9Sstevel@tonic-gate case EINPROGRESS: /* Operation now in progress */
34877c478bd9Sstevel@tonic-gate #endif /* EINPROGRESS */
34887c478bd9Sstevel@tonic-gate #ifdef EALREADY
34897c478bd9Sstevel@tonic-gate case EALREADY: /* Operation already in progress */
34907c478bd9Sstevel@tonic-gate #endif /* EALREADY */
34917c478bd9Sstevel@tonic-gate #ifdef EADDRINUSE
34927c478bd9Sstevel@tonic-gate case EADDRINUSE: /* Address already in use */
34937c478bd9Sstevel@tonic-gate #endif /* EADDRINUSE */
34947c478bd9Sstevel@tonic-gate #ifdef EADDRNOTAVAIL
34957c478bd9Sstevel@tonic-gate case EADDRNOTAVAIL: /* Can't assign requested address */
34967c478bd9Sstevel@tonic-gate #endif /* EADDRNOTAVAIL */
34977c478bd9Sstevel@tonic-gate #ifdef ETXTBSY
34987c478bd9Sstevel@tonic-gate case ETXTBSY: /* (Apollo) file locked */
34997c478bd9Sstevel@tonic-gate #endif /* ETXTBSY */
35007c478bd9Sstevel@tonic-gate #if defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR))
35017c478bd9Sstevel@tonic-gate case ENOSR: /* Out of streams resources */
35027c478bd9Sstevel@tonic-gate #endif /* defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) */
35037c478bd9Sstevel@tonic-gate #ifdef ENOLCK
35047c478bd9Sstevel@tonic-gate case ENOLCK: /* No locks available */
35057c478bd9Sstevel@tonic-gate #endif /* ENOLCK */
35067c478bd9Sstevel@tonic-gate case E_SM_OPENTIMEOUT: /* PSEUDO: open timed out */
35077c478bd9Sstevel@tonic-gate return true;
35087c478bd9Sstevel@tonic-gate }
35097c478bd9Sstevel@tonic-gate
35107c478bd9Sstevel@tonic-gate /* nope, must be permanent */
35117c478bd9Sstevel@tonic-gate return false;
35127c478bd9Sstevel@tonic-gate }
35137c478bd9Sstevel@tonic-gate /*
35147c478bd9Sstevel@tonic-gate ** LOCKFILE -- lock a file using flock or (shudder) fcntl locking
35157c478bd9Sstevel@tonic-gate **
35167c478bd9Sstevel@tonic-gate ** Parameters:
35177c478bd9Sstevel@tonic-gate ** fd -- the file descriptor of the file.
35187c478bd9Sstevel@tonic-gate ** filename -- the file name (for error messages).
35197c478bd9Sstevel@tonic-gate ** ext -- the filename extension.
35207c478bd9Sstevel@tonic-gate ** type -- type of the lock. Bits can be:
35217c478bd9Sstevel@tonic-gate ** LOCK_EX -- exclusive lock.
35227c478bd9Sstevel@tonic-gate ** LOCK_NB -- non-blocking.
35237c478bd9Sstevel@tonic-gate ** LOCK_UN -- unlock.
35247c478bd9Sstevel@tonic-gate **
35257c478bd9Sstevel@tonic-gate ** Returns:
35267c478bd9Sstevel@tonic-gate ** true if the lock was acquired.
35277c478bd9Sstevel@tonic-gate ** false otherwise.
35287c478bd9Sstevel@tonic-gate */
35297c478bd9Sstevel@tonic-gate
35307c478bd9Sstevel@tonic-gate bool
lockfile(fd,filename,ext,type)35317c478bd9Sstevel@tonic-gate lockfile(fd, filename, ext, type)
35327c478bd9Sstevel@tonic-gate int fd;
35337c478bd9Sstevel@tonic-gate char *filename;
35347c478bd9Sstevel@tonic-gate char *ext;
35357c478bd9Sstevel@tonic-gate int type;
35367c478bd9Sstevel@tonic-gate {
35377c478bd9Sstevel@tonic-gate int i;
35387c478bd9Sstevel@tonic-gate int save_errno;
35397c478bd9Sstevel@tonic-gate # if !HASFLOCK
35407c478bd9Sstevel@tonic-gate int action;
35417c478bd9Sstevel@tonic-gate struct flock lfd;
35427c478bd9Sstevel@tonic-gate
35437c478bd9Sstevel@tonic-gate if (ext == NULL)
35447c478bd9Sstevel@tonic-gate ext = "";
35457c478bd9Sstevel@tonic-gate
3546058561cbSjbeck memset(&lfd, '\0', sizeof(lfd));
35477c478bd9Sstevel@tonic-gate if (bitset(LOCK_UN, type))
35487c478bd9Sstevel@tonic-gate lfd.l_type = F_UNLCK;
35497c478bd9Sstevel@tonic-gate else if (bitset(LOCK_EX, type))
35507c478bd9Sstevel@tonic-gate lfd.l_type = F_WRLCK;
35517c478bd9Sstevel@tonic-gate else
35527c478bd9Sstevel@tonic-gate lfd.l_type = F_RDLCK;
35537c478bd9Sstevel@tonic-gate
35547c478bd9Sstevel@tonic-gate if (bitset(LOCK_NB, type))
35557c478bd9Sstevel@tonic-gate action = F_SETLK;
35567c478bd9Sstevel@tonic-gate else
35577c478bd9Sstevel@tonic-gate action = F_SETLKW;
35587c478bd9Sstevel@tonic-gate
35597c478bd9Sstevel@tonic-gate if (tTd(55, 60))
35607c478bd9Sstevel@tonic-gate sm_dprintf("lockfile(%s%s, action=%d, type=%d): ",
35617c478bd9Sstevel@tonic-gate filename, ext, action, lfd.l_type);
35627c478bd9Sstevel@tonic-gate
35637c478bd9Sstevel@tonic-gate while ((i = fcntl(fd, action, &lfd)) < 0 && errno == EINTR)
35647c478bd9Sstevel@tonic-gate continue;
35657c478bd9Sstevel@tonic-gate if (i >= 0)
35667c478bd9Sstevel@tonic-gate {
35677c478bd9Sstevel@tonic-gate if (tTd(55, 60))
35687c478bd9Sstevel@tonic-gate sm_dprintf("SUCCESS\n");
35697c478bd9Sstevel@tonic-gate return true;
35707c478bd9Sstevel@tonic-gate }
35717c478bd9Sstevel@tonic-gate save_errno = errno;
35727c478bd9Sstevel@tonic-gate
35737c478bd9Sstevel@tonic-gate if (tTd(55, 60))
35747c478bd9Sstevel@tonic-gate sm_dprintf("(%s) ", sm_errstring(save_errno));
35757c478bd9Sstevel@tonic-gate
35767c478bd9Sstevel@tonic-gate /*
35777c478bd9Sstevel@tonic-gate ** On SunOS, if you are testing using -oQ/tmp/mqueue or
35787c478bd9Sstevel@tonic-gate ** -oA/tmp/aliases or anything like that, and /tmp is mounted
35797c478bd9Sstevel@tonic-gate ** as type "tmp" (that is, served from swap space), the
35807c478bd9Sstevel@tonic-gate ** previous fcntl will fail with "Invalid argument" errors.
35817c478bd9Sstevel@tonic-gate ** Since this is fairly common during testing, we will assume
35827c478bd9Sstevel@tonic-gate ** that this indicates that the lock is successfully grabbed.
35837c478bd9Sstevel@tonic-gate */
35847c478bd9Sstevel@tonic-gate
35857c478bd9Sstevel@tonic-gate if (save_errno == EINVAL)
35867c478bd9Sstevel@tonic-gate {
35877c478bd9Sstevel@tonic-gate if (tTd(55, 60))
35887c478bd9Sstevel@tonic-gate sm_dprintf("SUCCESS\n");
35897c478bd9Sstevel@tonic-gate return true;
35907c478bd9Sstevel@tonic-gate }
35917c478bd9Sstevel@tonic-gate
35927c478bd9Sstevel@tonic-gate if (!bitset(LOCK_NB, type) ||
35937c478bd9Sstevel@tonic-gate (save_errno != EACCES && save_errno != EAGAIN))
35947c478bd9Sstevel@tonic-gate {
35957c478bd9Sstevel@tonic-gate int omode = fcntl(fd, F_GETFL, 0);
35967c478bd9Sstevel@tonic-gate uid_t euid = geteuid();
35977c478bd9Sstevel@tonic-gate
35987c478bd9Sstevel@tonic-gate errno = save_errno;
35997c478bd9Sstevel@tonic-gate syserr("cannot lockf(%s%s, fd=%d, type=%o, omode=%o, euid=%d)",
36007c478bd9Sstevel@tonic-gate filename, ext, fd, type, omode, euid);
36017c478bd9Sstevel@tonic-gate dumpfd(fd, true, true);
36027c478bd9Sstevel@tonic-gate }
36037c478bd9Sstevel@tonic-gate # else /* !HASFLOCK */
36047c478bd9Sstevel@tonic-gate if (ext == NULL)
36057c478bd9Sstevel@tonic-gate ext = "";
36067c478bd9Sstevel@tonic-gate
36077c478bd9Sstevel@tonic-gate if (tTd(55, 60))
36087c478bd9Sstevel@tonic-gate sm_dprintf("lockfile(%s%s, type=%o): ", filename, ext, type);
36097c478bd9Sstevel@tonic-gate
36107c478bd9Sstevel@tonic-gate while ((i = flock(fd, type)) < 0 && errno == EINTR)
36117c478bd9Sstevel@tonic-gate continue;
36127c478bd9Sstevel@tonic-gate if (i >= 0)
36137c478bd9Sstevel@tonic-gate {
36147c478bd9Sstevel@tonic-gate if (tTd(55, 60))
36157c478bd9Sstevel@tonic-gate sm_dprintf("SUCCESS\n");
36167c478bd9Sstevel@tonic-gate return true;
36177c478bd9Sstevel@tonic-gate }
36187c478bd9Sstevel@tonic-gate save_errno = errno;
36197c478bd9Sstevel@tonic-gate
36207c478bd9Sstevel@tonic-gate if (tTd(55, 60))
36217c478bd9Sstevel@tonic-gate sm_dprintf("(%s) ", sm_errstring(save_errno));
36227c478bd9Sstevel@tonic-gate
36237c478bd9Sstevel@tonic-gate if (!bitset(LOCK_NB, type) || save_errno != EWOULDBLOCK)
36247c478bd9Sstevel@tonic-gate {
36257c478bd9Sstevel@tonic-gate int omode = fcntl(fd, F_GETFL, 0);
36267c478bd9Sstevel@tonic-gate uid_t euid = geteuid();
36277c478bd9Sstevel@tonic-gate
36287c478bd9Sstevel@tonic-gate errno = save_errno;
36297c478bd9Sstevel@tonic-gate syserr("cannot flock(%s%s, fd=%d, type=%o, omode=%o, euid=%d)",
36307c478bd9Sstevel@tonic-gate filename, ext, fd, type, omode, euid);
36317c478bd9Sstevel@tonic-gate dumpfd(fd, true, true);
36327c478bd9Sstevel@tonic-gate }
36337c478bd9Sstevel@tonic-gate # endif /* !HASFLOCK */
36347c478bd9Sstevel@tonic-gate if (tTd(55, 60))
36357c478bd9Sstevel@tonic-gate sm_dprintf("FAIL\n");
36367c478bd9Sstevel@tonic-gate errno = save_errno;
36377c478bd9Sstevel@tonic-gate return false;
36387c478bd9Sstevel@tonic-gate }
36397c478bd9Sstevel@tonic-gate /*
36407c478bd9Sstevel@tonic-gate ** CHOWNSAFE -- tell if chown is "safe" (executable only by root)
36417c478bd9Sstevel@tonic-gate **
36427c478bd9Sstevel@tonic-gate ** Unfortunately, given that we can't predict other systems on which
36437c478bd9Sstevel@tonic-gate ** a remote mounted (NFS) filesystem will be mounted, the answer is
36447c478bd9Sstevel@tonic-gate ** almost always that this is unsafe.
36457c478bd9Sstevel@tonic-gate **
36467c478bd9Sstevel@tonic-gate ** Note also that many operating systems have non-compliant
36477c478bd9Sstevel@tonic-gate ** implementations of the _POSIX_CHOWN_RESTRICTED variable and the
36487c478bd9Sstevel@tonic-gate ** fpathconf() routine. According to IEEE 1003.1-1990, if
36497c478bd9Sstevel@tonic-gate ** _POSIX_CHOWN_RESTRICTED is defined and not equal to -1, then
36507c478bd9Sstevel@tonic-gate ** no non-root process can give away the file. However, vendors
36517c478bd9Sstevel@tonic-gate ** don't take NFS into account, so a comfortable value of
36527c478bd9Sstevel@tonic-gate ** _POSIX_CHOWN_RESTRICTED tells us nothing.
36537c478bd9Sstevel@tonic-gate **
36547c478bd9Sstevel@tonic-gate ** Also, some systems (e.g., IRIX 6.2) return 1 from fpathconf()
36557c478bd9Sstevel@tonic-gate ** even on files where chown is not restricted. Many systems get
36567c478bd9Sstevel@tonic-gate ** this wrong on NFS-based filesystems (that is, they say that chown
36577c478bd9Sstevel@tonic-gate ** is restricted [safe] on NFS filesystems where it may not be, since
36587c478bd9Sstevel@tonic-gate ** other systems can access the same filesystem and do file giveaway;
36597c478bd9Sstevel@tonic-gate ** only the NFS server knows for sure!) Hence, it is important to
36607c478bd9Sstevel@tonic-gate ** get the value of SAFENFSPATHCONF correct -- it should be defined
36617c478bd9Sstevel@tonic-gate ** _only_ after testing (see test/t_pathconf.c) a system on an unsafe
36627c478bd9Sstevel@tonic-gate ** NFS-based filesystem to ensure that you can get meaningful results.
36637c478bd9Sstevel@tonic-gate ** If in doubt, assume unsafe!
36647c478bd9Sstevel@tonic-gate **
36657c478bd9Sstevel@tonic-gate ** You may also need to tweak IS_SAFE_CHOWN -- it should be a
36667c478bd9Sstevel@tonic-gate ** condition indicating whether the return from pathconf indicates
36677c478bd9Sstevel@tonic-gate ** that chown is safe (typically either > 0 or >= 0 -- there isn't
36687c478bd9Sstevel@tonic-gate ** even any agreement about whether a zero return means that a file
36697c478bd9Sstevel@tonic-gate ** is or is not safe). It defaults to "> 0".
36707c478bd9Sstevel@tonic-gate **
36717c478bd9Sstevel@tonic-gate ** If the parent directory is safe (writable only by owner back
36727c478bd9Sstevel@tonic-gate ** to the root) then we can relax slightly and trust fpathconf
36737c478bd9Sstevel@tonic-gate ** in more circumstances. This is really a crock -- if this is an
36747c478bd9Sstevel@tonic-gate ** NFS mounted filesystem then we really know nothing about the
36757c478bd9Sstevel@tonic-gate ** underlying implementation. However, most systems pessimize and
36767c478bd9Sstevel@tonic-gate ** return an error (EINVAL or EOPNOTSUPP) on NFS filesystems, which
36777c478bd9Sstevel@tonic-gate ** we interpret as unsafe, as we should. Thus, this heuristic gets
36787c478bd9Sstevel@tonic-gate ** us into a possible problem only on systems that have a broken
36797c478bd9Sstevel@tonic-gate ** pathconf implementation and which are also poorly configured
36807c478bd9Sstevel@tonic-gate ** (have :include: files in group- or world-writable directories).
36817c478bd9Sstevel@tonic-gate **
36827c478bd9Sstevel@tonic-gate ** Parameters:
36837c478bd9Sstevel@tonic-gate ** fd -- the file descriptor to check.
36847c478bd9Sstevel@tonic-gate ** safedir -- set if the parent directory is safe.
36857c478bd9Sstevel@tonic-gate **
36867c478bd9Sstevel@tonic-gate ** Returns:
36877c478bd9Sstevel@tonic-gate ** true -- if the chown(2) operation is "safe" -- that is,
36887c478bd9Sstevel@tonic-gate ** only root can chown the file to an arbitrary user.
36897c478bd9Sstevel@tonic-gate ** false -- if an arbitrary user can give away a file.
36907c478bd9Sstevel@tonic-gate */
36917c478bd9Sstevel@tonic-gate
36927c478bd9Sstevel@tonic-gate #ifndef IS_SAFE_CHOWN
36937c478bd9Sstevel@tonic-gate # define IS_SAFE_CHOWN > 0
36947c478bd9Sstevel@tonic-gate #endif /* ! IS_SAFE_CHOWN */
36957c478bd9Sstevel@tonic-gate
36967c478bd9Sstevel@tonic-gate bool
chownsafe(fd,safedir)36977c478bd9Sstevel@tonic-gate chownsafe(fd, safedir)
36987c478bd9Sstevel@tonic-gate int fd;
36997c478bd9Sstevel@tonic-gate bool safedir;
37007c478bd9Sstevel@tonic-gate {
37017c478bd9Sstevel@tonic-gate # if (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && \
37027c478bd9Sstevel@tonic-gate (defined(_PC_CHOWN_RESTRICTED) || defined(_GNU_TYPES_H))
37037c478bd9Sstevel@tonic-gate int rval;
37047c478bd9Sstevel@tonic-gate
37057c478bd9Sstevel@tonic-gate /* give the system administrator a chance to override */
37067c478bd9Sstevel@tonic-gate if (bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail))
37077c478bd9Sstevel@tonic-gate return true;
37087c478bd9Sstevel@tonic-gate
37097c478bd9Sstevel@tonic-gate /*
37107c478bd9Sstevel@tonic-gate ** Some systems (e.g., SunOS) seem to have the call and the
37117c478bd9Sstevel@tonic-gate ** #define _PC_CHOWN_RESTRICTED, but don't actually implement
37127c478bd9Sstevel@tonic-gate ** the call. This heuristic checks for that.
37137c478bd9Sstevel@tonic-gate */
37147c478bd9Sstevel@tonic-gate
37157c478bd9Sstevel@tonic-gate errno = 0;
37167c478bd9Sstevel@tonic-gate rval = fpathconf(fd, _PC_CHOWN_RESTRICTED);
37177c478bd9Sstevel@tonic-gate # if SAFENFSPATHCONF
37187c478bd9Sstevel@tonic-gate return errno == 0 && rval IS_SAFE_CHOWN;
37197c478bd9Sstevel@tonic-gate # else /* SAFENFSPATHCONF */
37207c478bd9Sstevel@tonic-gate return safedir && errno == 0 && rval IS_SAFE_CHOWN;
37217c478bd9Sstevel@tonic-gate # endif /* SAFENFSPATHCONF */
37227c478bd9Sstevel@tonic-gate # else /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */
37237c478bd9Sstevel@tonic-gate return bitnset(DBS_ASSUMESAFECHOWN, DontBlameSendmail);
37247c478bd9Sstevel@tonic-gate # endif /* (!defined(_POSIX_CHOWN_RESTRICTED) || _POSIX_CHOWN_RESTRICTED != -1) && ... */
37257c478bd9Sstevel@tonic-gate }
37267c478bd9Sstevel@tonic-gate /*
37277c478bd9Sstevel@tonic-gate ** RESETLIMITS -- reset system controlled resource limits
37287c478bd9Sstevel@tonic-gate **
37297c478bd9Sstevel@tonic-gate ** This is to avoid denial-of-service attacks
37307c478bd9Sstevel@tonic-gate **
37317c478bd9Sstevel@tonic-gate ** Parameters:
37327c478bd9Sstevel@tonic-gate ** none
37337c478bd9Sstevel@tonic-gate **
37347c478bd9Sstevel@tonic-gate ** Returns:
37357c478bd9Sstevel@tonic-gate ** none
37367c478bd9Sstevel@tonic-gate */
37377c478bd9Sstevel@tonic-gate
37387c478bd9Sstevel@tonic-gate #if HASSETRLIMIT
37397c478bd9Sstevel@tonic-gate # ifdef RLIMIT_NEEDS_SYS_TIME_H
374049218d4fSjbeck # include <sm/time.h>
37417c478bd9Sstevel@tonic-gate # endif /* RLIMIT_NEEDS_SYS_TIME_H */
37427c478bd9Sstevel@tonic-gate # include <sys/resource.h>
37437c478bd9Sstevel@tonic-gate #endif /* HASSETRLIMIT */
37447c478bd9Sstevel@tonic-gate
37457c478bd9Sstevel@tonic-gate void
resetlimits()37467c478bd9Sstevel@tonic-gate resetlimits()
37477c478bd9Sstevel@tonic-gate {
37487c478bd9Sstevel@tonic-gate #if HASSETRLIMIT
37497c478bd9Sstevel@tonic-gate struct rlimit lim;
37507c478bd9Sstevel@tonic-gate
37517c478bd9Sstevel@tonic-gate lim.rlim_cur = lim.rlim_max = RLIM_INFINITY;
37527c478bd9Sstevel@tonic-gate (void) setrlimit(RLIMIT_CPU, &lim);
37537c478bd9Sstevel@tonic-gate (void) setrlimit(RLIMIT_FSIZE, &lim);
37547c478bd9Sstevel@tonic-gate # ifdef RLIMIT_NOFILE
37557c478bd9Sstevel@tonic-gate lim.rlim_cur = lim.rlim_max = FD_SETSIZE;
37567c478bd9Sstevel@tonic-gate (void) setrlimit(RLIMIT_NOFILE, &lim);
37577c478bd9Sstevel@tonic-gate # endif /* RLIMIT_NOFILE */
37587c478bd9Sstevel@tonic-gate #else /* HASSETRLIMIT */
37597c478bd9Sstevel@tonic-gate # if HASULIMIT
37607c478bd9Sstevel@tonic-gate (void) ulimit(2, 0x3fffff);
37617c478bd9Sstevel@tonic-gate (void) ulimit(4, FD_SETSIZE);
37627c478bd9Sstevel@tonic-gate # endif /* HASULIMIT */
37637c478bd9Sstevel@tonic-gate #endif /* HASSETRLIMIT */
37647c478bd9Sstevel@tonic-gate errno = 0;
37657c478bd9Sstevel@tonic-gate }
37667c478bd9Sstevel@tonic-gate /*
37677c478bd9Sstevel@tonic-gate ** SETVENDOR -- process vendor code from V configuration line
37687c478bd9Sstevel@tonic-gate **
37697c478bd9Sstevel@tonic-gate ** Parameters:
37707c478bd9Sstevel@tonic-gate ** vendor -- string representation of vendor.
37717c478bd9Sstevel@tonic-gate **
37727c478bd9Sstevel@tonic-gate ** Returns:
37737c478bd9Sstevel@tonic-gate ** true -- if ok.
37747c478bd9Sstevel@tonic-gate ** false -- if vendor code could not be processed.
37757c478bd9Sstevel@tonic-gate **
37767c478bd9Sstevel@tonic-gate ** Side Effects:
37777c478bd9Sstevel@tonic-gate ** It is reasonable to set mode flags here to tweak
37787c478bd9Sstevel@tonic-gate ** processing in other parts of the code if necessary.
37797c478bd9Sstevel@tonic-gate ** For example, if you are a vendor that uses $%y to
37807c478bd9Sstevel@tonic-gate ** indicate YP lookups, you could enable that here.
37817c478bd9Sstevel@tonic-gate */
37827c478bd9Sstevel@tonic-gate
37837c478bd9Sstevel@tonic-gate bool
setvendor(vendor)37847c478bd9Sstevel@tonic-gate setvendor(vendor)
37857c478bd9Sstevel@tonic-gate char *vendor;
37867c478bd9Sstevel@tonic-gate {
37877c478bd9Sstevel@tonic-gate if (sm_strcasecmp(vendor, "Berkeley") == 0)
37887c478bd9Sstevel@tonic-gate {
37897c478bd9Sstevel@tonic-gate VendorCode = VENDOR_BERKELEY;
37907c478bd9Sstevel@tonic-gate return true;
37917c478bd9Sstevel@tonic-gate }
37927c478bd9Sstevel@tonic-gate
37937c478bd9Sstevel@tonic-gate /* add vendor extensions here */
37947c478bd9Sstevel@tonic-gate
37957c478bd9Sstevel@tonic-gate #ifdef SUN_EXTENSIONS
37967c478bd9Sstevel@tonic-gate if (sm_strcasecmp(vendor, "Sun") == 0)
37977c478bd9Sstevel@tonic-gate {
37987c478bd9Sstevel@tonic-gate VendorCode = VENDOR_SUN;
37997c478bd9Sstevel@tonic-gate return true;
38007c478bd9Sstevel@tonic-gate }
38017c478bd9Sstevel@tonic-gate #endif /* SUN_EXTENSIONS */
380249218d4fSjbeck #ifdef DEC
380349218d4fSjbeck if (sm_strcasecmp(vendor, "Digital") == 0)
380449218d4fSjbeck {
380549218d4fSjbeck VendorCode = VENDOR_DEC;
380649218d4fSjbeck return true;
380749218d4fSjbeck }
380849218d4fSjbeck #endif /* DEC */
38097c478bd9Sstevel@tonic-gate
38107c478bd9Sstevel@tonic-gate #if defined(VENDOR_NAME) && defined(VENDOR_CODE)
38117c478bd9Sstevel@tonic-gate if (sm_strcasecmp(vendor, VENDOR_NAME) == 0)
38127c478bd9Sstevel@tonic-gate {
38137c478bd9Sstevel@tonic-gate VendorCode = VENDOR_CODE;
38147c478bd9Sstevel@tonic-gate return true;
38157c478bd9Sstevel@tonic-gate }
38167c478bd9Sstevel@tonic-gate #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */
38177c478bd9Sstevel@tonic-gate
38187c478bd9Sstevel@tonic-gate return false;
38197c478bd9Sstevel@tonic-gate }
38207c478bd9Sstevel@tonic-gate /*
38217c478bd9Sstevel@tonic-gate ** GETVENDOR -- return vendor name based on vendor code
38227c478bd9Sstevel@tonic-gate **
38237c478bd9Sstevel@tonic-gate ** Parameters:
38247c478bd9Sstevel@tonic-gate ** vendorcode -- numeric representation of vendor.
38257c478bd9Sstevel@tonic-gate **
38267c478bd9Sstevel@tonic-gate ** Returns:
38277c478bd9Sstevel@tonic-gate ** string containing vendor name.
38287c478bd9Sstevel@tonic-gate */
38297c478bd9Sstevel@tonic-gate
38307c478bd9Sstevel@tonic-gate char *
getvendor(vendorcode)38317c478bd9Sstevel@tonic-gate getvendor(vendorcode)
38327c478bd9Sstevel@tonic-gate int vendorcode;
38337c478bd9Sstevel@tonic-gate {
38347c478bd9Sstevel@tonic-gate #if defined(VENDOR_NAME) && defined(VENDOR_CODE)
38357c478bd9Sstevel@tonic-gate /*
38367c478bd9Sstevel@tonic-gate ** Can't have the same switch case twice so need to
38377c478bd9Sstevel@tonic-gate ** handle VENDOR_CODE outside of switch. It might
38387c478bd9Sstevel@tonic-gate ** match one of the existing VENDOR_* codes.
38397c478bd9Sstevel@tonic-gate */
38407c478bd9Sstevel@tonic-gate
38417c478bd9Sstevel@tonic-gate if (vendorcode == VENDOR_CODE)
38427c478bd9Sstevel@tonic-gate return VENDOR_NAME;
38437c478bd9Sstevel@tonic-gate #endif /* defined(VENDOR_NAME) && defined(VENDOR_CODE) */
38447c478bd9Sstevel@tonic-gate
38457c478bd9Sstevel@tonic-gate switch (vendorcode)
38467c478bd9Sstevel@tonic-gate {
38477c478bd9Sstevel@tonic-gate case VENDOR_BERKELEY:
38487c478bd9Sstevel@tonic-gate return "Berkeley";
38497c478bd9Sstevel@tonic-gate
38507c478bd9Sstevel@tonic-gate case VENDOR_SUN:
38517c478bd9Sstevel@tonic-gate return "Sun";
38527c478bd9Sstevel@tonic-gate
38537c478bd9Sstevel@tonic-gate case VENDOR_HP:
38547c478bd9Sstevel@tonic-gate return "HP";
38557c478bd9Sstevel@tonic-gate
38567c478bd9Sstevel@tonic-gate case VENDOR_IBM:
38577c478bd9Sstevel@tonic-gate return "IBM";
38587c478bd9Sstevel@tonic-gate
38597c478bd9Sstevel@tonic-gate case VENDOR_SENDMAIL:
38607c478bd9Sstevel@tonic-gate return "Sendmail";
38617c478bd9Sstevel@tonic-gate
38627c478bd9Sstevel@tonic-gate default:
38637c478bd9Sstevel@tonic-gate return "Unknown";
38647c478bd9Sstevel@tonic-gate }
38657c478bd9Sstevel@tonic-gate }
38667c478bd9Sstevel@tonic-gate /*
38677c478bd9Sstevel@tonic-gate ** VENDOR_PRE_DEFAULTS, VENDOR_POST_DEFAULTS -- set vendor-specific defaults
38687c478bd9Sstevel@tonic-gate **
38697c478bd9Sstevel@tonic-gate ** Vendor_pre_defaults is called before reading the configuration
38707c478bd9Sstevel@tonic-gate ** file; vendor_post_defaults is called immediately after.
38717c478bd9Sstevel@tonic-gate **
38727c478bd9Sstevel@tonic-gate ** Parameters:
38737c478bd9Sstevel@tonic-gate ** e -- the global environment to initialize.
38747c478bd9Sstevel@tonic-gate **
38757c478bd9Sstevel@tonic-gate ** Returns:
38767c478bd9Sstevel@tonic-gate ** none.
38777c478bd9Sstevel@tonic-gate */
38787c478bd9Sstevel@tonic-gate
38797c478bd9Sstevel@tonic-gate #if SHARE_V1
38807c478bd9Sstevel@tonic-gate int DefShareUid; /* default share uid to run as -- unused??? */
38817c478bd9Sstevel@tonic-gate #endif /* SHARE_V1 */
38827c478bd9Sstevel@tonic-gate
38837c478bd9Sstevel@tonic-gate void
vendor_pre_defaults(e)38847c478bd9Sstevel@tonic-gate vendor_pre_defaults(e)
38857c478bd9Sstevel@tonic-gate ENVELOPE *e;
38867c478bd9Sstevel@tonic-gate {
38877c478bd9Sstevel@tonic-gate #if SHARE_V1
38887c478bd9Sstevel@tonic-gate /* OTHERUID is defined in shares.h, do not be alarmed */
38897c478bd9Sstevel@tonic-gate DefShareUid = OTHERUID;
38907c478bd9Sstevel@tonic-gate #endif /* SHARE_V1 */
38917c478bd9Sstevel@tonic-gate #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES)
38927c478bd9Sstevel@tonic-gate sun_pre_defaults(e);
38937c478bd9Sstevel@tonic-gate #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */
38947c478bd9Sstevel@tonic-gate #ifdef apollo
38957c478bd9Sstevel@tonic-gate /*
38967c478bd9Sstevel@tonic-gate ** stupid domain/os can't even open
38977c478bd9Sstevel@tonic-gate ** /etc/mail/sendmail.cf without this
38987c478bd9Sstevel@tonic-gate */
38997c478bd9Sstevel@tonic-gate
3900445f2479Sjbeck sm_setuserenv("ISP", NULL);
3901445f2479Sjbeck sm_setuserenv("SYSTYPE", NULL);
39027c478bd9Sstevel@tonic-gate #endif /* apollo */
39037c478bd9Sstevel@tonic-gate }
39047c478bd9Sstevel@tonic-gate
39057c478bd9Sstevel@tonic-gate
39067c478bd9Sstevel@tonic-gate void
vendor_post_defaults(e)39077c478bd9Sstevel@tonic-gate vendor_post_defaults(e)
39087c478bd9Sstevel@tonic-gate ENVELOPE *e;
39097c478bd9Sstevel@tonic-gate {
39107c478bd9Sstevel@tonic-gate #ifdef __QNX__
39117c478bd9Sstevel@tonic-gate /* Makes sure the SOCK environment variable remains */
39124aac33d3Sjbeck sm_setuserenv("SOCK", NULL);
39137c478bd9Sstevel@tonic-gate #endif /* __QNX__ */
39147c478bd9Sstevel@tonic-gate #if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES)
39157c478bd9Sstevel@tonic-gate sun_post_defaults(e);
39167c478bd9Sstevel@tonic-gate #endif /* defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES) */
39177c478bd9Sstevel@tonic-gate }
39187c478bd9Sstevel@tonic-gate /*
39197c478bd9Sstevel@tonic-gate ** VENDOR_DAEMON_SETUP -- special vendor setup needed for daemon mode
39207c478bd9Sstevel@tonic-gate */
39217c478bd9Sstevel@tonic-gate
39227c478bd9Sstevel@tonic-gate void
vendor_daemon_setup(e)39237c478bd9Sstevel@tonic-gate vendor_daemon_setup(e)
39247c478bd9Sstevel@tonic-gate ENVELOPE *e;
39257c478bd9Sstevel@tonic-gate {
39267c478bd9Sstevel@tonic-gate #if HASSETLOGIN
39277c478bd9Sstevel@tonic-gate (void) setlogin(RunAsUserName);
39287c478bd9Sstevel@tonic-gate #endif /* HASSETLOGIN */
39297c478bd9Sstevel@tonic-gate #if SECUREWARE
39307c478bd9Sstevel@tonic-gate if (getluid() != -1)
39317c478bd9Sstevel@tonic-gate {
39327c478bd9Sstevel@tonic-gate usrerr("Daemon cannot have LUID");
39337c478bd9Sstevel@tonic-gate finis(false, true, EX_USAGE);
39347c478bd9Sstevel@tonic-gate }
39357c478bd9Sstevel@tonic-gate #endif /* SECUREWARE */
39367c478bd9Sstevel@tonic-gate }
39377c478bd9Sstevel@tonic-gate /*
39387c478bd9Sstevel@tonic-gate ** VENDOR_SET_UID -- do setup for setting a user id
39397c478bd9Sstevel@tonic-gate **
39407c478bd9Sstevel@tonic-gate ** This is called when we are still root.
39417c478bd9Sstevel@tonic-gate **
39427c478bd9Sstevel@tonic-gate ** Parameters:
39437c478bd9Sstevel@tonic-gate ** uid -- the uid we are about to become.
39447c478bd9Sstevel@tonic-gate **
39457c478bd9Sstevel@tonic-gate ** Returns:
39467c478bd9Sstevel@tonic-gate ** none.
39477c478bd9Sstevel@tonic-gate */
39487c478bd9Sstevel@tonic-gate
39497c478bd9Sstevel@tonic-gate void
vendor_set_uid(uid)39507c478bd9Sstevel@tonic-gate vendor_set_uid(uid)
39517c478bd9Sstevel@tonic-gate UID_T uid;
39527c478bd9Sstevel@tonic-gate {
39537c478bd9Sstevel@tonic-gate /*
39547c478bd9Sstevel@tonic-gate ** We need to setup the share groups (lnodes)
39557c478bd9Sstevel@tonic-gate ** and add auditing information (luid's)
39567c478bd9Sstevel@tonic-gate ** before we loose our ``root''ness.
39577c478bd9Sstevel@tonic-gate */
39587c478bd9Sstevel@tonic-gate #if SHARE_V1
39597c478bd9Sstevel@tonic-gate if (setupshares(uid, syserr) != 0)
39607c478bd9Sstevel@tonic-gate syserr("Unable to set up shares");
39617c478bd9Sstevel@tonic-gate #endif /* SHARE_V1 */
39627c478bd9Sstevel@tonic-gate #if SECUREWARE
39637c478bd9Sstevel@tonic-gate (void) setup_secure(uid);
39647c478bd9Sstevel@tonic-gate #endif /* SECUREWARE */
39657c478bd9Sstevel@tonic-gate }
39667c478bd9Sstevel@tonic-gate /*
39677c478bd9Sstevel@tonic-gate ** VALIDATE_CONNECTION -- check connection for rationality
39687c478bd9Sstevel@tonic-gate **
39697c478bd9Sstevel@tonic-gate ** If the connection is rejected, this routine should log an
39707c478bd9Sstevel@tonic-gate ** appropriate message -- but should never issue any SMTP protocol.
39717c478bd9Sstevel@tonic-gate **
39727c478bd9Sstevel@tonic-gate ** Parameters:
39737c478bd9Sstevel@tonic-gate ** sap -- a pointer to a SOCKADDR naming the peer.
39747c478bd9Sstevel@tonic-gate ** hostname -- the name corresponding to sap.
39757c478bd9Sstevel@tonic-gate ** e -- the current envelope.
39767c478bd9Sstevel@tonic-gate **
39777c478bd9Sstevel@tonic-gate ** Returns:
39787c478bd9Sstevel@tonic-gate ** error message from rejection.
39797c478bd9Sstevel@tonic-gate ** NULL if not rejected.
39807c478bd9Sstevel@tonic-gate */
39817c478bd9Sstevel@tonic-gate
39827c478bd9Sstevel@tonic-gate #if TCPWRAPPERS
39837c478bd9Sstevel@tonic-gate # include <tcpd.h>
39847c478bd9Sstevel@tonic-gate
39857c478bd9Sstevel@tonic-gate /* tcpwrappers does no logging, but you still have to declare these -- ugh */
39867c478bd9Sstevel@tonic-gate int allow_severity = LOG_INFO;
39877c478bd9Sstevel@tonic-gate int deny_severity = LOG_NOTICE;
39887c478bd9Sstevel@tonic-gate #endif /* TCPWRAPPERS */
39897c478bd9Sstevel@tonic-gate
39907c478bd9Sstevel@tonic-gate char *
validate_connection(sap,hostname,e)39917c478bd9Sstevel@tonic-gate validate_connection(sap, hostname, e)
39927c478bd9Sstevel@tonic-gate SOCKADDR *sap;
39937c478bd9Sstevel@tonic-gate char *hostname;
39947c478bd9Sstevel@tonic-gate ENVELOPE *e;
39957c478bd9Sstevel@tonic-gate {
39967c478bd9Sstevel@tonic-gate #if TCPWRAPPERS
39977c478bd9Sstevel@tonic-gate char *host;
39987c478bd9Sstevel@tonic-gate char *addr;
39997c478bd9Sstevel@tonic-gate extern int hosts_ctl();
40007c478bd9Sstevel@tonic-gate #endif /* TCPWRAPPERS */
40017c478bd9Sstevel@tonic-gate
40027c478bd9Sstevel@tonic-gate if (tTd(48, 3))
40037c478bd9Sstevel@tonic-gate sm_dprintf("validate_connection(%s, %s)\n",
40047c478bd9Sstevel@tonic-gate hostname, anynet_ntoa(sap));
40057c478bd9Sstevel@tonic-gate
40067c478bd9Sstevel@tonic-gate connection_rate_check(sap, e);
40077c478bd9Sstevel@tonic-gate if (rscheck("check_relay", hostname, anynet_ntoa(sap),
4008058561cbSjbeck e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID, NULL) != EX_OK)
40097c478bd9Sstevel@tonic-gate {
40107c478bd9Sstevel@tonic-gate static char reject[BUFSIZ*2];
40117c478bd9Sstevel@tonic-gate extern char MsgBuf[];
40127c478bd9Sstevel@tonic-gate
40137c478bd9Sstevel@tonic-gate if (tTd(48, 4))
40147c478bd9Sstevel@tonic-gate sm_dprintf(" ... validate_connection: BAD (rscheck)\n");
40157c478bd9Sstevel@tonic-gate
40167c478bd9Sstevel@tonic-gate if (strlen(MsgBuf) >= 3)
4017058561cbSjbeck (void) sm_strlcpy(reject, MsgBuf, sizeof(reject));
40187c478bd9Sstevel@tonic-gate else
4019058561cbSjbeck (void) sm_strlcpy(reject, "Access denied", sizeof(reject));
40207c478bd9Sstevel@tonic-gate
40217c478bd9Sstevel@tonic-gate return reject;
40227c478bd9Sstevel@tonic-gate }
40237c478bd9Sstevel@tonic-gate
40247c478bd9Sstevel@tonic-gate #if TCPWRAPPERS
40257c478bd9Sstevel@tonic-gate if (hostname[0] == '[' && hostname[strlen(hostname) - 1] == ']')
40267c478bd9Sstevel@tonic-gate host = "unknown";
40277c478bd9Sstevel@tonic-gate else
40287c478bd9Sstevel@tonic-gate host = hostname;
40297c478bd9Sstevel@tonic-gate addr = anynet_ntoa(sap);
40307c478bd9Sstevel@tonic-gate
40317c478bd9Sstevel@tonic-gate # if NETINET6
40327c478bd9Sstevel@tonic-gate /* TCP/Wrappers don't want the IPv6: protocol label */
40337c478bd9Sstevel@tonic-gate if (addr != NULL && sm_strncasecmp(addr, "IPv6:", 5) == 0)
40347c478bd9Sstevel@tonic-gate addr += 5;
40357c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
40367c478bd9Sstevel@tonic-gate
40377c478bd9Sstevel@tonic-gate if (!hosts_ctl("sendmail", host, addr, STRING_UNKNOWN))
40387c478bd9Sstevel@tonic-gate {
40397c478bd9Sstevel@tonic-gate if (tTd(48, 4))
40407c478bd9Sstevel@tonic-gate sm_dprintf(" ... validate_connection: BAD (tcpwrappers)\n");
40417c478bd9Sstevel@tonic-gate if (LogLevel > 3)
40427c478bd9Sstevel@tonic-gate sm_syslog(LOG_NOTICE, e->e_id,
40437c478bd9Sstevel@tonic-gate "tcpwrappers (%s, %s) rejection",
40447c478bd9Sstevel@tonic-gate host, addr);
40457c478bd9Sstevel@tonic-gate return "Access denied";
40467c478bd9Sstevel@tonic-gate }
40477c478bd9Sstevel@tonic-gate #endif /* TCPWRAPPERS */
40487c478bd9Sstevel@tonic-gate if (tTd(48, 4))
40497c478bd9Sstevel@tonic-gate sm_dprintf(" ... validate_connection: OK\n");
40507c478bd9Sstevel@tonic-gate return NULL;
40517c478bd9Sstevel@tonic-gate }
40527c478bd9Sstevel@tonic-gate
40537c478bd9Sstevel@tonic-gate /*
40547c478bd9Sstevel@tonic-gate ** STRTOL -- convert string to long integer
40557c478bd9Sstevel@tonic-gate **
40567c478bd9Sstevel@tonic-gate ** For systems that don't have it in the C library.
40577c478bd9Sstevel@tonic-gate **
40587c478bd9Sstevel@tonic-gate ** This is taken verbatim from the 4.4-Lite C library.
40597c478bd9Sstevel@tonic-gate */
40607c478bd9Sstevel@tonic-gate
40617c478bd9Sstevel@tonic-gate #if NEEDSTRTOL
40627c478bd9Sstevel@tonic-gate
40637c478bd9Sstevel@tonic-gate # if defined(LIBC_SCCS) && !defined(lint)
40647c478bd9Sstevel@tonic-gate static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93";
40657c478bd9Sstevel@tonic-gate # endif /* defined(LIBC_SCCS) && !defined(lint) */
40667c478bd9Sstevel@tonic-gate
40677c478bd9Sstevel@tonic-gate /*
40687c478bd9Sstevel@tonic-gate ** Convert a string to a long integer.
40697c478bd9Sstevel@tonic-gate **
40707c478bd9Sstevel@tonic-gate ** Ignores `locale' stuff. Assumes that the upper and lower case
40717c478bd9Sstevel@tonic-gate ** alphabets and digits are each contiguous.
40727c478bd9Sstevel@tonic-gate */
40737c478bd9Sstevel@tonic-gate
40747c478bd9Sstevel@tonic-gate long
strtol(nptr,endptr,base)40757c478bd9Sstevel@tonic-gate strtol(nptr, endptr, base)
40767c478bd9Sstevel@tonic-gate const char *nptr;
40777c478bd9Sstevel@tonic-gate char **endptr;
40787c478bd9Sstevel@tonic-gate register int base;
40797c478bd9Sstevel@tonic-gate {
40807c478bd9Sstevel@tonic-gate register const char *s = nptr;
40817c478bd9Sstevel@tonic-gate register unsigned long acc;
40827c478bd9Sstevel@tonic-gate register int c;
40837c478bd9Sstevel@tonic-gate register unsigned long cutoff;
40847c478bd9Sstevel@tonic-gate register int neg = 0, any, cutlim;
40857c478bd9Sstevel@tonic-gate
40867c478bd9Sstevel@tonic-gate /*
40877c478bd9Sstevel@tonic-gate ** Skip white space and pick up leading +/- sign if any.
40887c478bd9Sstevel@tonic-gate ** If base is 0, allow 0x for hex and 0 for octal, else
40897c478bd9Sstevel@tonic-gate ** assume decimal; if base is already 16, allow 0x.
40907c478bd9Sstevel@tonic-gate */
40917c478bd9Sstevel@tonic-gate do {
40927c478bd9Sstevel@tonic-gate c = *s++;
4093*e9af4bc0SJohn Beck } while (isascii(c) && isspace(c));
40947c478bd9Sstevel@tonic-gate if (c == '-') {
40957c478bd9Sstevel@tonic-gate neg = 1;
40967c478bd9Sstevel@tonic-gate c = *s++;
40977c478bd9Sstevel@tonic-gate } else if (c == '+')
40987c478bd9Sstevel@tonic-gate c = *s++;
40997c478bd9Sstevel@tonic-gate if ((base == 0 || base == 16) &&
41007c478bd9Sstevel@tonic-gate c == '0' && (*s == 'x' || *s == 'X')) {
41017c478bd9Sstevel@tonic-gate c = s[1];
41027c478bd9Sstevel@tonic-gate s += 2;
41037c478bd9Sstevel@tonic-gate base = 16;
41047c478bd9Sstevel@tonic-gate }
41057c478bd9Sstevel@tonic-gate if (base == 0)
41067c478bd9Sstevel@tonic-gate base = c == '0' ? 8 : 10;
41077c478bd9Sstevel@tonic-gate
41087c478bd9Sstevel@tonic-gate /*
41097c478bd9Sstevel@tonic-gate ** Compute the cutoff value between legal numbers and illegal
41107c478bd9Sstevel@tonic-gate ** numbers. That is the largest legal value, divided by the
41117c478bd9Sstevel@tonic-gate ** base. An input number that is greater than this value, if
41127c478bd9Sstevel@tonic-gate ** followed by a legal input character, is too big. One that
41137c478bd9Sstevel@tonic-gate ** is equal to this value may be valid or not; the limit
41147c478bd9Sstevel@tonic-gate ** between valid and invalid numbers is then based on the last
41157c478bd9Sstevel@tonic-gate ** digit. For instance, if the range for longs is
41167c478bd9Sstevel@tonic-gate ** [-2147483648..2147483647] and the input base is 10,
41177c478bd9Sstevel@tonic-gate ** cutoff will be set to 214748364 and cutlim to either
41187c478bd9Sstevel@tonic-gate ** 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
41197c478bd9Sstevel@tonic-gate ** a value > 214748364, or equal but the next digit is > 7 (or 8),
41207c478bd9Sstevel@tonic-gate ** the number is too big, and we will return a range error.
41217c478bd9Sstevel@tonic-gate **
41227c478bd9Sstevel@tonic-gate ** Set any if any `digits' consumed; make it negative to indicate
41237c478bd9Sstevel@tonic-gate ** overflow.
41247c478bd9Sstevel@tonic-gate */
41257c478bd9Sstevel@tonic-gate cutoff = neg ? -(unsigned long) LONG_MIN : LONG_MAX;
41267c478bd9Sstevel@tonic-gate cutlim = cutoff % (unsigned long) base;
41277c478bd9Sstevel@tonic-gate cutoff /= (unsigned long) base;
41287c478bd9Sstevel@tonic-gate for (acc = 0, any = 0;; c = *s++) {
4129*e9af4bc0SJohn Beck if (isascii(c) && isdigit(c))
41307c478bd9Sstevel@tonic-gate c -= '0';
4131*e9af4bc0SJohn Beck else if (isascii(c) && isalpha(c))
41327c478bd9Sstevel@tonic-gate c -= isupper(c) ? 'A' - 10 : 'a' - 10;
41337c478bd9Sstevel@tonic-gate else
41347c478bd9Sstevel@tonic-gate break;
41357c478bd9Sstevel@tonic-gate if (c >= base)
41367c478bd9Sstevel@tonic-gate break;
41377c478bd9Sstevel@tonic-gate if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim)
41387c478bd9Sstevel@tonic-gate any = -1;
41397c478bd9Sstevel@tonic-gate else {
41407c478bd9Sstevel@tonic-gate any = 1;
41417c478bd9Sstevel@tonic-gate acc *= base;
41427c478bd9Sstevel@tonic-gate acc += c;
41437c478bd9Sstevel@tonic-gate }
41447c478bd9Sstevel@tonic-gate }
41457c478bd9Sstevel@tonic-gate if (any < 0) {
41467c478bd9Sstevel@tonic-gate acc = neg ? LONG_MIN : LONG_MAX;
41477c478bd9Sstevel@tonic-gate errno = ERANGE;
41487c478bd9Sstevel@tonic-gate } else if (neg)
41497c478bd9Sstevel@tonic-gate acc = -acc;
41507c478bd9Sstevel@tonic-gate if (endptr != 0)
41517c478bd9Sstevel@tonic-gate *endptr = (char *)(any ? s - 1 : nptr);
41527c478bd9Sstevel@tonic-gate return acc;
41537c478bd9Sstevel@tonic-gate }
41547c478bd9Sstevel@tonic-gate
41557c478bd9Sstevel@tonic-gate #endif /* NEEDSTRTOL */
41567c478bd9Sstevel@tonic-gate /*
41577c478bd9Sstevel@tonic-gate ** STRSTR -- find first substring in string
41587c478bd9Sstevel@tonic-gate **
41597c478bd9Sstevel@tonic-gate ** Parameters:
41607c478bd9Sstevel@tonic-gate ** big -- the big (full) string.
41617c478bd9Sstevel@tonic-gate ** little -- the little (sub) string.
41627c478bd9Sstevel@tonic-gate **
41637c478bd9Sstevel@tonic-gate ** Returns:
41647c478bd9Sstevel@tonic-gate ** A pointer to the first instance of little in big.
41657c478bd9Sstevel@tonic-gate ** big if little is the null string.
41667c478bd9Sstevel@tonic-gate ** NULL if little is not contained in big.
41677c478bd9Sstevel@tonic-gate */
41687c478bd9Sstevel@tonic-gate
41697c478bd9Sstevel@tonic-gate #if NEEDSTRSTR
41707c478bd9Sstevel@tonic-gate
41717c478bd9Sstevel@tonic-gate char *
strstr(big,little)41727c478bd9Sstevel@tonic-gate strstr(big, little)
41737c478bd9Sstevel@tonic-gate char *big;
41747c478bd9Sstevel@tonic-gate char *little;
41757c478bd9Sstevel@tonic-gate {
41767c478bd9Sstevel@tonic-gate register char *p = big;
41777c478bd9Sstevel@tonic-gate int l;
41787c478bd9Sstevel@tonic-gate
41797c478bd9Sstevel@tonic-gate if (*little == '\0')
41807c478bd9Sstevel@tonic-gate return big;
41817c478bd9Sstevel@tonic-gate l = strlen(little);
41827c478bd9Sstevel@tonic-gate
41837c478bd9Sstevel@tonic-gate while ((p = strchr(p, *little)) != NULL)
41847c478bd9Sstevel@tonic-gate {
41857c478bd9Sstevel@tonic-gate if (strncmp(p, little, l) == 0)
41867c478bd9Sstevel@tonic-gate return p;
41877c478bd9Sstevel@tonic-gate p++;
41887c478bd9Sstevel@tonic-gate }
41897c478bd9Sstevel@tonic-gate return NULL;
41907c478bd9Sstevel@tonic-gate }
41917c478bd9Sstevel@tonic-gate
41927c478bd9Sstevel@tonic-gate #endif /* NEEDSTRSTR */
41937c478bd9Sstevel@tonic-gate /*
41947c478bd9Sstevel@tonic-gate ** SM_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX
41957c478bd9Sstevel@tonic-gate **
41967c478bd9Sstevel@tonic-gate ** Some operating systems have wierd problems with the gethostbyXXX
41977c478bd9Sstevel@tonic-gate ** routines. For example, Solaris versions at least through 2.3
41987c478bd9Sstevel@tonic-gate ** don't properly deliver a canonical h_name field. This tries to
41997c478bd9Sstevel@tonic-gate ** work around these problems.
42007c478bd9Sstevel@tonic-gate **
42017c478bd9Sstevel@tonic-gate ** Support IPv6 as well as IPv4.
42027c478bd9Sstevel@tonic-gate */
42037c478bd9Sstevel@tonic-gate
42047c478bd9Sstevel@tonic-gate #if NETINET6 && NEEDSGETIPNODE
42057c478bd9Sstevel@tonic-gate
42067c478bd9Sstevel@tonic-gate # ifndef AI_DEFAULT
42077c478bd9Sstevel@tonic-gate # define AI_DEFAULT 0 /* dummy */
42087c478bd9Sstevel@tonic-gate # endif /* ! AI_DEFAULT */
42097c478bd9Sstevel@tonic-gate # ifndef AI_ADDRCONFIG
42107c478bd9Sstevel@tonic-gate # define AI_ADDRCONFIG 0 /* dummy */
42117c478bd9Sstevel@tonic-gate # endif /* ! AI_ADDRCONFIG */
42127c478bd9Sstevel@tonic-gate # ifndef AI_V4MAPPED
42137c478bd9Sstevel@tonic-gate # define AI_V4MAPPED 0 /* dummy */
42147c478bd9Sstevel@tonic-gate # endif /* ! AI_V4MAPPED */
42157c478bd9Sstevel@tonic-gate # ifndef AI_ALL
42167c478bd9Sstevel@tonic-gate # define AI_ALL 0 /* dummy */
42177c478bd9Sstevel@tonic-gate # endif /* ! AI_ALL */
42187c478bd9Sstevel@tonic-gate
42197c478bd9Sstevel@tonic-gate static struct hostent *
getipnodebyname(name,family,flags,err)42207c478bd9Sstevel@tonic-gate getipnodebyname(name, family, flags, err)
42217c478bd9Sstevel@tonic-gate char *name;
42227c478bd9Sstevel@tonic-gate int family;
42237c478bd9Sstevel@tonic-gate int flags;
42247c478bd9Sstevel@tonic-gate int *err;
42257c478bd9Sstevel@tonic-gate {
42267c478bd9Sstevel@tonic-gate bool resv6 = true;
42277c478bd9Sstevel@tonic-gate struct hostent *h;
42287c478bd9Sstevel@tonic-gate
42297c478bd9Sstevel@tonic-gate if (family == AF_INET6)
42307c478bd9Sstevel@tonic-gate {
42317c478bd9Sstevel@tonic-gate /* From RFC2133, section 6.1 */
42327c478bd9Sstevel@tonic-gate resv6 = bitset(RES_USE_INET6, _res.options);
42337c478bd9Sstevel@tonic-gate _res.options |= RES_USE_INET6;
42347c478bd9Sstevel@tonic-gate }
42357c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(0);
42367c478bd9Sstevel@tonic-gate h = gethostbyname(name);
42377c478bd9Sstevel@tonic-gate if (!resv6)
42387c478bd9Sstevel@tonic-gate _res.options &= ~RES_USE_INET6;
42397c478bd9Sstevel@tonic-gate *err = h_errno;
42407c478bd9Sstevel@tonic-gate return h;
42417c478bd9Sstevel@tonic-gate }
42427c478bd9Sstevel@tonic-gate
42437c478bd9Sstevel@tonic-gate static struct hostent *
getipnodebyaddr(addr,len,family,err)42447c478bd9Sstevel@tonic-gate getipnodebyaddr(addr, len, family, err)
42457c478bd9Sstevel@tonic-gate char *addr;
42467c478bd9Sstevel@tonic-gate int len;
42477c478bd9Sstevel@tonic-gate int family;
42487c478bd9Sstevel@tonic-gate int *err;
42497c478bd9Sstevel@tonic-gate {
42507c478bd9Sstevel@tonic-gate struct hostent *h;
42517c478bd9Sstevel@tonic-gate
42527c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(0);
42537c478bd9Sstevel@tonic-gate h = gethostbyaddr(addr, len, family);
42547c478bd9Sstevel@tonic-gate *err = h_errno;
42557c478bd9Sstevel@tonic-gate return h;
42567c478bd9Sstevel@tonic-gate }
42577c478bd9Sstevel@tonic-gate
42587c478bd9Sstevel@tonic-gate void
freehostent(h)42597c478bd9Sstevel@tonic-gate freehostent(h)
42607c478bd9Sstevel@tonic-gate struct hostent *h;
42617c478bd9Sstevel@tonic-gate {
42627c478bd9Sstevel@tonic-gate /*
42637c478bd9Sstevel@tonic-gate ** Stub routine -- if they don't have getipnodeby*(),
42647c478bd9Sstevel@tonic-gate ** they probably don't have the free routine either.
42657c478bd9Sstevel@tonic-gate */
42667c478bd9Sstevel@tonic-gate
42677c478bd9Sstevel@tonic-gate return;
42687c478bd9Sstevel@tonic-gate }
42697c478bd9Sstevel@tonic-gate #endif /* NETINET6 && NEEDSGETIPNODE */
42707c478bd9Sstevel@tonic-gate
42717c478bd9Sstevel@tonic-gate struct hostent *
sm_gethostbyname(name,family)42727c478bd9Sstevel@tonic-gate sm_gethostbyname(name, family)
42737c478bd9Sstevel@tonic-gate char *name;
42747c478bd9Sstevel@tonic-gate int family;
42757c478bd9Sstevel@tonic-gate {
42767c478bd9Sstevel@tonic-gate int save_errno;
42777c478bd9Sstevel@tonic-gate struct hostent *h = NULL;
42787c478bd9Sstevel@tonic-gate #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4))
42797c478bd9Sstevel@tonic-gate # if SOLARIS == 20300 || SOLARIS == 203
42807c478bd9Sstevel@tonic-gate static struct hostent hp;
42817c478bd9Sstevel@tonic-gate static char buf[1000];
42827c478bd9Sstevel@tonic-gate extern struct hostent *_switch_gethostbyname_r();
42837c478bd9Sstevel@tonic-gate
42847c478bd9Sstevel@tonic-gate if (tTd(61, 10))
42857c478bd9Sstevel@tonic-gate sm_dprintf("_switch_gethostbyname_r(%s)... ", name);
42867c478bd9Sstevel@tonic-gate h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno);
42877c478bd9Sstevel@tonic-gate save_errno = errno;
42887c478bd9Sstevel@tonic-gate # else /* SOLARIS == 20300 || SOLARIS == 203 */
42897c478bd9Sstevel@tonic-gate extern struct hostent *__switch_gethostbyname();
42907c478bd9Sstevel@tonic-gate
42917c478bd9Sstevel@tonic-gate if (tTd(61, 10))
42927c478bd9Sstevel@tonic-gate sm_dprintf("__switch_gethostbyname(%s)... ", name);
42937c478bd9Sstevel@tonic-gate h = __switch_gethostbyname(name);
42947c478bd9Sstevel@tonic-gate save_errno = errno;
42957c478bd9Sstevel@tonic-gate # endif /* SOLARIS == 20300 || SOLARIS == 203 */
42967c478bd9Sstevel@tonic-gate #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */
42977c478bd9Sstevel@tonic-gate int nmaps;
42987c478bd9Sstevel@tonic-gate # if NETINET6
42997c478bd9Sstevel@tonic-gate int flags = AI_DEFAULT|AI_ALL;
43007c478bd9Sstevel@tonic-gate int err;
43017c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
43027c478bd9Sstevel@tonic-gate char *maptype[MAXMAPSTACK];
43037c478bd9Sstevel@tonic-gate short mapreturn[MAXMAPACTIONS];
43047c478bd9Sstevel@tonic-gate char hbuf[MAXNAME];
43057c478bd9Sstevel@tonic-gate
43067c478bd9Sstevel@tonic-gate if (tTd(61, 10))
43077c478bd9Sstevel@tonic-gate sm_dprintf("sm_gethostbyname(%s, %d)... ", name, family);
43087c478bd9Sstevel@tonic-gate
43097c478bd9Sstevel@tonic-gate # if NETINET6
43107c478bd9Sstevel@tonic-gate # if ADDRCONFIG_IS_BROKEN
43117c478bd9Sstevel@tonic-gate flags &= ~AI_ADDRCONFIG;
43127c478bd9Sstevel@tonic-gate # endif /* ADDRCONFIG_IS_BROKEN */
43137c478bd9Sstevel@tonic-gate h = getipnodebyname(name, family, flags, &err);
43147c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(err);
43157c478bd9Sstevel@tonic-gate # else /* NETINET6 */
43167c478bd9Sstevel@tonic-gate h = gethostbyname(name);
43177c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
43187c478bd9Sstevel@tonic-gate
43197c478bd9Sstevel@tonic-gate save_errno = errno;
43207c478bd9Sstevel@tonic-gate if (h == NULL)
43217c478bd9Sstevel@tonic-gate {
43227c478bd9Sstevel@tonic-gate if (tTd(61, 10))
43237c478bd9Sstevel@tonic-gate sm_dprintf("failure\n");
43247c478bd9Sstevel@tonic-gate
43257c478bd9Sstevel@tonic-gate nmaps = switch_map_find("hosts", maptype, mapreturn);
43267c478bd9Sstevel@tonic-gate while (--nmaps >= 0)
43277c478bd9Sstevel@tonic-gate {
43287c478bd9Sstevel@tonic-gate if (strcmp(maptype[nmaps], "nis") == 0 ||
43297c478bd9Sstevel@tonic-gate strcmp(maptype[nmaps], "files") == 0)
43307c478bd9Sstevel@tonic-gate break;
43317c478bd9Sstevel@tonic-gate }
43327c478bd9Sstevel@tonic-gate
43337c478bd9Sstevel@tonic-gate if (nmaps >= 0)
43347c478bd9Sstevel@tonic-gate {
43357c478bd9Sstevel@tonic-gate /* try short name */
4336058561cbSjbeck if (strlen(name) > sizeof(hbuf) - 1)
43377c478bd9Sstevel@tonic-gate {
43387c478bd9Sstevel@tonic-gate errno = save_errno;
43397c478bd9Sstevel@tonic-gate return NULL;
43407c478bd9Sstevel@tonic-gate }
4341058561cbSjbeck (void) sm_strlcpy(hbuf, name, sizeof(hbuf));
43427c478bd9Sstevel@tonic-gate (void) shorten_hostname(hbuf);
43437c478bd9Sstevel@tonic-gate
43447c478bd9Sstevel@tonic-gate /* if it hasn't been shortened, there's no point */
43457c478bd9Sstevel@tonic-gate if (strcmp(hbuf, name) != 0)
43467c478bd9Sstevel@tonic-gate {
43477c478bd9Sstevel@tonic-gate if (tTd(61, 10))
43487c478bd9Sstevel@tonic-gate sm_dprintf("sm_gethostbyname(%s, %d)... ",
43497c478bd9Sstevel@tonic-gate hbuf, family);
43507c478bd9Sstevel@tonic-gate
43517c478bd9Sstevel@tonic-gate # if NETINET6
43527c478bd9Sstevel@tonic-gate h = getipnodebyname(hbuf, family, flags, &err);
43537c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(err);
43547c478bd9Sstevel@tonic-gate save_errno = errno;
43557c478bd9Sstevel@tonic-gate # else /* NETINET6 */
43567c478bd9Sstevel@tonic-gate h = gethostbyname(hbuf);
43577c478bd9Sstevel@tonic-gate save_errno = errno;
43587c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
43597c478bd9Sstevel@tonic-gate }
43607c478bd9Sstevel@tonic-gate }
43617c478bd9Sstevel@tonic-gate }
43627c478bd9Sstevel@tonic-gate #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) || (defined(sony_news) && defined(__svr4)) */
43637c478bd9Sstevel@tonic-gate if (tTd(61, 10))
43647c478bd9Sstevel@tonic-gate {
43657c478bd9Sstevel@tonic-gate if (h == NULL)
43667c478bd9Sstevel@tonic-gate sm_dprintf("failure\n");
43677c478bd9Sstevel@tonic-gate else
43687c478bd9Sstevel@tonic-gate {
43697c478bd9Sstevel@tonic-gate sm_dprintf("%s\n", h->h_name);
43707c478bd9Sstevel@tonic-gate if (tTd(61, 11))
43717c478bd9Sstevel@tonic-gate {
43727c478bd9Sstevel@tonic-gate #if NETINET6
43737c478bd9Sstevel@tonic-gate struct in6_addr ia6;
43747c478bd9Sstevel@tonic-gate char buf6[INET6_ADDRSTRLEN];
43757c478bd9Sstevel@tonic-gate #else /* NETINET6 */
43767c478bd9Sstevel@tonic-gate struct in_addr ia;
43777c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
43787c478bd9Sstevel@tonic-gate size_t i;
43797c478bd9Sstevel@tonic-gate
43807c478bd9Sstevel@tonic-gate if (h->h_aliases != NULL)
43817c478bd9Sstevel@tonic-gate for (i = 0; h->h_aliases[i] != NULL;
43827c478bd9Sstevel@tonic-gate i++)
43837c478bd9Sstevel@tonic-gate sm_dprintf("\talias: %s\n",
43847c478bd9Sstevel@tonic-gate h->h_aliases[i]);
43857c478bd9Sstevel@tonic-gate for (i = 0; h->h_addr_list[i] != NULL; i++)
43867c478bd9Sstevel@tonic-gate {
43877c478bd9Sstevel@tonic-gate char *addr;
43887c478bd9Sstevel@tonic-gate
43897c478bd9Sstevel@tonic-gate #if NETINET6
43907c478bd9Sstevel@tonic-gate memmove(&ia6, h->h_addr_list[i],
43917c478bd9Sstevel@tonic-gate IN6ADDRSZ);
43927c478bd9Sstevel@tonic-gate addr = anynet_ntop(&ia6,
4393058561cbSjbeck buf6, sizeof(buf6));
43947c478bd9Sstevel@tonic-gate #else /* NETINET6 */
43957c478bd9Sstevel@tonic-gate memmove(&ia, h->h_addr_list[i],
43967c478bd9Sstevel@tonic-gate INADDRSZ);
43977c478bd9Sstevel@tonic-gate addr = (char *) inet_ntoa(ia);
43987c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
43997c478bd9Sstevel@tonic-gate if (addr != NULL)
44007c478bd9Sstevel@tonic-gate sm_dprintf("\taddr: %s\n", addr);
44017c478bd9Sstevel@tonic-gate }
44027c478bd9Sstevel@tonic-gate }
44037c478bd9Sstevel@tonic-gate }
44047c478bd9Sstevel@tonic-gate }
44057c478bd9Sstevel@tonic-gate errno = save_errno;
44067c478bd9Sstevel@tonic-gate return h;
44077c478bd9Sstevel@tonic-gate }
44087c478bd9Sstevel@tonic-gate
44097c478bd9Sstevel@tonic-gate struct hostent *
sm_gethostbyaddr(addr,len,type)44107c478bd9Sstevel@tonic-gate sm_gethostbyaddr(addr, len, type)
44117c478bd9Sstevel@tonic-gate char *addr;
44127c478bd9Sstevel@tonic-gate int len;
44137c478bd9Sstevel@tonic-gate int type;
44147c478bd9Sstevel@tonic-gate {
44157c478bd9Sstevel@tonic-gate struct hostent *hp;
44167c478bd9Sstevel@tonic-gate
44177c478bd9Sstevel@tonic-gate #if NETINET6
44187c478bd9Sstevel@tonic-gate if (type == AF_INET6 &&
44197c478bd9Sstevel@tonic-gate IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *) addr))
44207c478bd9Sstevel@tonic-gate {
44217c478bd9Sstevel@tonic-gate /* Avoid reverse lookup for IPv6 unspecified address */
44227c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(HOST_NOT_FOUND);
44237c478bd9Sstevel@tonic-gate return NULL;
44247c478bd9Sstevel@tonic-gate }
44257c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
44267c478bd9Sstevel@tonic-gate
44277c478bd9Sstevel@tonic-gate #if (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204)
44287c478bd9Sstevel@tonic-gate # if SOLARIS == 20300 || SOLARIS == 203
44297c478bd9Sstevel@tonic-gate {
44307c478bd9Sstevel@tonic-gate static struct hostent he;
44317c478bd9Sstevel@tonic-gate static char buf[1000];
44327c478bd9Sstevel@tonic-gate extern struct hostent *_switch_gethostbyaddr_r();
44337c478bd9Sstevel@tonic-gate
44347c478bd9Sstevel@tonic-gate hp = _switch_gethostbyaddr_r(addr, len, type, &he,
44357c478bd9Sstevel@tonic-gate buf, sizeof(buf), &h_errno);
44367c478bd9Sstevel@tonic-gate }
44377c478bd9Sstevel@tonic-gate # else /* SOLARIS == 20300 || SOLARIS == 203 */
44387c478bd9Sstevel@tonic-gate {
44397c478bd9Sstevel@tonic-gate extern struct hostent *__switch_gethostbyaddr();
44407c478bd9Sstevel@tonic-gate
44417c478bd9Sstevel@tonic-gate hp = __switch_gethostbyaddr(addr, len, type);
44427c478bd9Sstevel@tonic-gate }
44437c478bd9Sstevel@tonic-gate # endif /* SOLARIS == 20300 || SOLARIS == 203 */
44447c478bd9Sstevel@tonic-gate #else /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */
44457c478bd9Sstevel@tonic-gate # if NETINET6
44467c478bd9Sstevel@tonic-gate {
44477c478bd9Sstevel@tonic-gate int err;
44487c478bd9Sstevel@tonic-gate
44497c478bd9Sstevel@tonic-gate hp = getipnodebyaddr(addr, len, type, &err);
44507c478bd9Sstevel@tonic-gate SM_SET_H_ERRNO(err);
44517c478bd9Sstevel@tonic-gate }
44527c478bd9Sstevel@tonic-gate # else /* NETINET6 */
44537c478bd9Sstevel@tonic-gate hp = gethostbyaddr(addr, len, type);
44547c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
44557c478bd9Sstevel@tonic-gate #endif /* (SOLARIS > 10000 && SOLARIS < 20400) || (defined(SOLARIS) && SOLARIS < 204) */
44567c478bd9Sstevel@tonic-gate return hp;
44577c478bd9Sstevel@tonic-gate }
44587c478bd9Sstevel@tonic-gate /*
44597c478bd9Sstevel@tonic-gate ** SM_GETPW{NAM,UID} -- wrapper for getpwnam and getpwuid
44607c478bd9Sstevel@tonic-gate */
44617c478bd9Sstevel@tonic-gate
44627c478bd9Sstevel@tonic-gate struct passwd *
sm_getpwnam(user)44637c478bd9Sstevel@tonic-gate sm_getpwnam(user)
44647c478bd9Sstevel@tonic-gate char *user;
44657c478bd9Sstevel@tonic-gate {
44667c478bd9Sstevel@tonic-gate #ifdef _AIX4
44677c478bd9Sstevel@tonic-gate extern struct passwd *_getpwnam_shadow(const char *, const int);
44687c478bd9Sstevel@tonic-gate
44697c478bd9Sstevel@tonic-gate return _getpwnam_shadow(user, 0);
44707c478bd9Sstevel@tonic-gate #else /* _AIX4 */
44717c478bd9Sstevel@tonic-gate return getpwnam(user);
44727c478bd9Sstevel@tonic-gate #endif /* _AIX4 */
44737c478bd9Sstevel@tonic-gate }
44747c478bd9Sstevel@tonic-gate
44757c478bd9Sstevel@tonic-gate struct passwd *
sm_getpwuid(uid)44767c478bd9Sstevel@tonic-gate sm_getpwuid(uid)
44777c478bd9Sstevel@tonic-gate UID_T uid;
44787c478bd9Sstevel@tonic-gate {
44797c478bd9Sstevel@tonic-gate #if defined(_AIX4) && 0
44807c478bd9Sstevel@tonic-gate extern struct passwd *_getpwuid_shadow(const int, const int);
44817c478bd9Sstevel@tonic-gate
44827c478bd9Sstevel@tonic-gate return _getpwuid_shadow(uid,0);
44837c478bd9Sstevel@tonic-gate #else /* defined(_AIX4) && 0 */
44847c478bd9Sstevel@tonic-gate return getpwuid(uid);
44857c478bd9Sstevel@tonic-gate #endif /* defined(_AIX4) && 0 */
44867c478bd9Sstevel@tonic-gate }
44877c478bd9Sstevel@tonic-gate /*
44887c478bd9Sstevel@tonic-gate ** SECUREWARE_SETUP_SECURE -- Convex SecureWare setup
44897c478bd9Sstevel@tonic-gate **
44907c478bd9Sstevel@tonic-gate ** Set up the trusted computing environment for C2 level security
44917c478bd9Sstevel@tonic-gate ** under SecureWare.
44927c478bd9Sstevel@tonic-gate **
44937c478bd9Sstevel@tonic-gate ** Parameters:
44947c478bd9Sstevel@tonic-gate ** uid -- uid of the user to initialize in the TCB
44957c478bd9Sstevel@tonic-gate **
44967c478bd9Sstevel@tonic-gate ** Returns:
44977c478bd9Sstevel@tonic-gate ** none
44987c478bd9Sstevel@tonic-gate **
44997c478bd9Sstevel@tonic-gate ** Side Effects:
45007c478bd9Sstevel@tonic-gate ** Initialized the user in the trusted computing base
45017c478bd9Sstevel@tonic-gate */
45027c478bd9Sstevel@tonic-gate
45037c478bd9Sstevel@tonic-gate #if SECUREWARE
45047c478bd9Sstevel@tonic-gate
45057c478bd9Sstevel@tonic-gate # include <sys/security.h>
45067c478bd9Sstevel@tonic-gate # include <prot.h>
45077c478bd9Sstevel@tonic-gate
45087c478bd9Sstevel@tonic-gate void
secureware_setup_secure(uid)45097c478bd9Sstevel@tonic-gate secureware_setup_secure(uid)
45107c478bd9Sstevel@tonic-gate UID_T uid;
45117c478bd9Sstevel@tonic-gate {
45127c478bd9Sstevel@tonic-gate int rc;
45137c478bd9Sstevel@tonic-gate
45147c478bd9Sstevel@tonic-gate if (getluid() != -1)
45157c478bd9Sstevel@tonic-gate return;
45167c478bd9Sstevel@tonic-gate
45177c478bd9Sstevel@tonic-gate if ((rc = set_secure_info(uid)) != SSI_GOOD_RETURN)
45187c478bd9Sstevel@tonic-gate {
45197c478bd9Sstevel@tonic-gate switch (rc)
45207c478bd9Sstevel@tonic-gate {
45217c478bd9Sstevel@tonic-gate case SSI_NO_PRPW_ENTRY:
45227c478bd9Sstevel@tonic-gate syserr("No protected passwd entry, uid = %d",
45237c478bd9Sstevel@tonic-gate (int) uid);
45247c478bd9Sstevel@tonic-gate break;
45257c478bd9Sstevel@tonic-gate
45267c478bd9Sstevel@tonic-gate case SSI_LOCKED:
45277c478bd9Sstevel@tonic-gate syserr("Account has been disabled, uid = %d",
45287c478bd9Sstevel@tonic-gate (int) uid);
45297c478bd9Sstevel@tonic-gate break;
45307c478bd9Sstevel@tonic-gate
45317c478bd9Sstevel@tonic-gate case SSI_RETIRED:
45327c478bd9Sstevel@tonic-gate syserr("Account has been retired, uid = %d",
45337c478bd9Sstevel@tonic-gate (int) uid);
45347c478bd9Sstevel@tonic-gate break;
45357c478bd9Sstevel@tonic-gate
45367c478bd9Sstevel@tonic-gate case SSI_BAD_SET_LUID:
45377c478bd9Sstevel@tonic-gate syserr("Could not set LUID, uid = %d", (int) uid);
45387c478bd9Sstevel@tonic-gate break;
45397c478bd9Sstevel@tonic-gate
45407c478bd9Sstevel@tonic-gate case SSI_BAD_SET_PRIVS:
45417c478bd9Sstevel@tonic-gate syserr("Could not set kernel privs, uid = %d",
45427c478bd9Sstevel@tonic-gate (int) uid);
45437c478bd9Sstevel@tonic-gate
45447c478bd9Sstevel@tonic-gate default:
45457c478bd9Sstevel@tonic-gate syserr("Unknown return code (%d) from set_secure_info(%d)",
45467c478bd9Sstevel@tonic-gate rc, (int) uid);
45477c478bd9Sstevel@tonic-gate break;
45487c478bd9Sstevel@tonic-gate }
45497c478bd9Sstevel@tonic-gate finis(false, true, EX_NOPERM);
45507c478bd9Sstevel@tonic-gate }
45517c478bd9Sstevel@tonic-gate }
45527c478bd9Sstevel@tonic-gate #endif /* SECUREWARE */
45537c478bd9Sstevel@tonic-gate /*
45547c478bd9Sstevel@tonic-gate ** ADD_HOSTNAMES -- Add a hostname to class 'w' based on IP address
45557c478bd9Sstevel@tonic-gate **
45567c478bd9Sstevel@tonic-gate ** Add hostnames to class 'w' based on the IP address read from
45577c478bd9Sstevel@tonic-gate ** the network interface.
45587c478bd9Sstevel@tonic-gate **
45597c478bd9Sstevel@tonic-gate ** Parameters:
45607c478bd9Sstevel@tonic-gate ** sa -- a pointer to a SOCKADDR containing the address
45617c478bd9Sstevel@tonic-gate **
45627c478bd9Sstevel@tonic-gate ** Returns:
45637c478bd9Sstevel@tonic-gate ** 0 if successful, -1 if host lookup fails.
45647c478bd9Sstevel@tonic-gate */
45657c478bd9Sstevel@tonic-gate
45667c478bd9Sstevel@tonic-gate static int
add_hostnames(sa)45677c478bd9Sstevel@tonic-gate add_hostnames(sa)
45687c478bd9Sstevel@tonic-gate SOCKADDR *sa;
45697c478bd9Sstevel@tonic-gate {
45707c478bd9Sstevel@tonic-gate struct hostent *hp;
45717c478bd9Sstevel@tonic-gate char **ha;
45727c478bd9Sstevel@tonic-gate char hnb[MAXHOSTNAMELEN];
45737c478bd9Sstevel@tonic-gate
45747c478bd9Sstevel@tonic-gate /* lookup name with IP address */
45757c478bd9Sstevel@tonic-gate switch (sa->sa.sa_family)
45767c478bd9Sstevel@tonic-gate {
45777c478bd9Sstevel@tonic-gate #if NETINET
45787c478bd9Sstevel@tonic-gate case AF_INET:
45797c478bd9Sstevel@tonic-gate hp = sm_gethostbyaddr((char *) &sa->sin.sin_addr,
45807c478bd9Sstevel@tonic-gate sizeof(sa->sin.sin_addr),
45817c478bd9Sstevel@tonic-gate sa->sa.sa_family);
45827c478bd9Sstevel@tonic-gate break;
45837c478bd9Sstevel@tonic-gate #endif /* NETINET */
45847c478bd9Sstevel@tonic-gate
45857c478bd9Sstevel@tonic-gate #if NETINET6
45867c478bd9Sstevel@tonic-gate case AF_INET6:
45877c478bd9Sstevel@tonic-gate hp = sm_gethostbyaddr((char *) &sa->sin6.sin6_addr,
45887c478bd9Sstevel@tonic-gate sizeof(sa->sin6.sin6_addr),
45897c478bd9Sstevel@tonic-gate sa->sa.sa_family);
45907c478bd9Sstevel@tonic-gate break;
45917c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
45927c478bd9Sstevel@tonic-gate
45937c478bd9Sstevel@tonic-gate default:
45947c478bd9Sstevel@tonic-gate /* Give warning about unsupported family */
45957c478bd9Sstevel@tonic-gate if (LogLevel > 3)
45967c478bd9Sstevel@tonic-gate sm_syslog(LOG_WARNING, NOQID,
45977c478bd9Sstevel@tonic-gate "Unsupported address family %d: %.100s",
45987c478bd9Sstevel@tonic-gate sa->sa.sa_family, anynet_ntoa(sa));
45997c478bd9Sstevel@tonic-gate return -1;
46007c478bd9Sstevel@tonic-gate }
46017c478bd9Sstevel@tonic-gate
46027c478bd9Sstevel@tonic-gate if (hp == NULL)
46037c478bd9Sstevel@tonic-gate {
46047c478bd9Sstevel@tonic-gate int save_errno = errno;
46057c478bd9Sstevel@tonic-gate
46067c478bd9Sstevel@tonic-gate if (LogLevel > 3 &&
46077c478bd9Sstevel@tonic-gate #if NETINET6
46087c478bd9Sstevel@tonic-gate !(sa->sa.sa_family == AF_INET6 &&
46097c478bd9Sstevel@tonic-gate IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr)) &&
46107c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
46117c478bd9Sstevel@tonic-gate true)
46127c478bd9Sstevel@tonic-gate sm_syslog(LOG_WARNING, NOQID,
46137c478bd9Sstevel@tonic-gate "gethostbyaddr(%.100s) failed: %d",
46147c478bd9Sstevel@tonic-gate anynet_ntoa(sa),
46157c478bd9Sstevel@tonic-gate #if NAMED_BIND
46167c478bd9Sstevel@tonic-gate h_errno
46177c478bd9Sstevel@tonic-gate #else /* NAMED_BIND */
46187c478bd9Sstevel@tonic-gate -1
46197c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
46207c478bd9Sstevel@tonic-gate );
46217c478bd9Sstevel@tonic-gate errno = save_errno;
46227c478bd9Sstevel@tonic-gate return -1;
46237c478bd9Sstevel@tonic-gate }
46247c478bd9Sstevel@tonic-gate
46257c478bd9Sstevel@tonic-gate /* save its cname */
46267c478bd9Sstevel@tonic-gate if (!wordinclass((char *) hp->h_name, 'w'))
46277c478bd9Sstevel@tonic-gate {
46287c478bd9Sstevel@tonic-gate setclass('w', (char *) hp->h_name);
46297c478bd9Sstevel@tonic-gate if (tTd(0, 4))
46307c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s\n", hp->h_name);
46317c478bd9Sstevel@tonic-gate
4632058561cbSjbeck if (sm_snprintf(hnb, sizeof(hnb), "[%s]", hp->h_name) <
4633058561cbSjbeck sizeof(hnb)
46347c478bd9Sstevel@tonic-gate && !wordinclass((char *) hnb, 'w'))
46357c478bd9Sstevel@tonic-gate setclass('w', hnb);
46367c478bd9Sstevel@tonic-gate }
46377c478bd9Sstevel@tonic-gate else
46387c478bd9Sstevel@tonic-gate {
46397c478bd9Sstevel@tonic-gate if (tTd(0, 43))
46407c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s (already in $=w)\n", hp->h_name);
46417c478bd9Sstevel@tonic-gate }
46427c478bd9Sstevel@tonic-gate
46437c478bd9Sstevel@tonic-gate /* save all it aliases name */
46447c478bd9Sstevel@tonic-gate for (ha = hp->h_aliases; ha != NULL && *ha != NULL; ha++)
46457c478bd9Sstevel@tonic-gate {
46467c478bd9Sstevel@tonic-gate if (!wordinclass(*ha, 'w'))
46477c478bd9Sstevel@tonic-gate {
46487c478bd9Sstevel@tonic-gate setclass('w', *ha);
46497c478bd9Sstevel@tonic-gate if (tTd(0, 4))
46507c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s\n", *ha);
4651058561cbSjbeck if (sm_snprintf(hnb, sizeof(hnb),
4652058561cbSjbeck "[%s]", *ha) < sizeof(hnb) &&
46537c478bd9Sstevel@tonic-gate !wordinclass((char *) hnb, 'w'))
46547c478bd9Sstevel@tonic-gate setclass('w', hnb);
46557c478bd9Sstevel@tonic-gate }
46567c478bd9Sstevel@tonic-gate else
46577c478bd9Sstevel@tonic-gate {
46587c478bd9Sstevel@tonic-gate if (tTd(0, 43))
46597c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s (already in $=w)\n",
46607c478bd9Sstevel@tonic-gate *ha);
46617c478bd9Sstevel@tonic-gate }
46627c478bd9Sstevel@tonic-gate }
46637c478bd9Sstevel@tonic-gate #if NETINET6
46647c478bd9Sstevel@tonic-gate freehostent(hp);
46657c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
46667c478bd9Sstevel@tonic-gate return 0;
46677c478bd9Sstevel@tonic-gate }
46687c478bd9Sstevel@tonic-gate /*
46697c478bd9Sstevel@tonic-gate ** LOAD_IF_NAMES -- load interface-specific names into $=w
46707c478bd9Sstevel@tonic-gate **
46717c478bd9Sstevel@tonic-gate ** Parameters:
46727c478bd9Sstevel@tonic-gate ** none.
46737c478bd9Sstevel@tonic-gate **
46747c478bd9Sstevel@tonic-gate ** Returns:
46757c478bd9Sstevel@tonic-gate ** none.
46767c478bd9Sstevel@tonic-gate **
46777c478bd9Sstevel@tonic-gate ** Side Effects:
46787c478bd9Sstevel@tonic-gate ** Loads $=w with the names of all the interfaces.
46797c478bd9Sstevel@tonic-gate */
46807c478bd9Sstevel@tonic-gate
46817c478bd9Sstevel@tonic-gate #if !NETINET
46827c478bd9Sstevel@tonic-gate # define SIOCGIFCONF_IS_BROKEN 1 /* XXX */
46837c478bd9Sstevel@tonic-gate #endif /* !NETINET */
46847c478bd9Sstevel@tonic-gate
46857c478bd9Sstevel@tonic-gate #if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN
46867c478bd9Sstevel@tonic-gate struct rtentry;
46877c478bd9Sstevel@tonic-gate struct mbuf;
46887c478bd9Sstevel@tonic-gate # ifndef SUNOS403
468949218d4fSjbeck # include <sm/time.h>
46907c478bd9Sstevel@tonic-gate # endif /* ! SUNOS403 */
46917c478bd9Sstevel@tonic-gate # if (_AIX4 >= 40300) && !defined(_NET_IF_H)
46927c478bd9Sstevel@tonic-gate # undef __P
46937c478bd9Sstevel@tonic-gate # endif /* (_AIX4 >= 40300) && !defined(_NET_IF_H) */
46947c478bd9Sstevel@tonic-gate # include <net/if.h>
46957c478bd9Sstevel@tonic-gate #endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */
46967c478bd9Sstevel@tonic-gate
46977c478bd9Sstevel@tonic-gate void
load_if_names()46987c478bd9Sstevel@tonic-gate load_if_names()
46997c478bd9Sstevel@tonic-gate {
47007c478bd9Sstevel@tonic-gate # if NETINET6 && defined(SIOCGLIFCONF)
47017c478bd9Sstevel@tonic-gate # ifdef __hpux
47027c478bd9Sstevel@tonic-gate
47037c478bd9Sstevel@tonic-gate /*
47047c478bd9Sstevel@tonic-gate ** Unfortunately, HP has changed all of the structures,
47057c478bd9Sstevel@tonic-gate ** making life difficult for implementors.
47067c478bd9Sstevel@tonic-gate */
47077c478bd9Sstevel@tonic-gate
47087c478bd9Sstevel@tonic-gate # define lifconf if_laddrconf
47097c478bd9Sstevel@tonic-gate # define lifc_len iflc_len
47107c478bd9Sstevel@tonic-gate # define lifc_buf iflc_buf
47117c478bd9Sstevel@tonic-gate # define lifreq if_laddrreq
47127c478bd9Sstevel@tonic-gate # define lifr_addr iflr_addr
47137c478bd9Sstevel@tonic-gate # define lifr_name iflr_name
47147c478bd9Sstevel@tonic-gate # define lifr_flags iflr_flags
47157c478bd9Sstevel@tonic-gate # define ss_family sa_family
47167c478bd9Sstevel@tonic-gate # undef SIOCGLIFNUM
47177c478bd9Sstevel@tonic-gate # endif /* __hpux */
47187c478bd9Sstevel@tonic-gate
47197c478bd9Sstevel@tonic-gate int s;
47207c478bd9Sstevel@tonic-gate int i;
47217c478bd9Sstevel@tonic-gate size_t len;
47227c478bd9Sstevel@tonic-gate int numifs;
47237c478bd9Sstevel@tonic-gate char *buf;
47247c478bd9Sstevel@tonic-gate struct lifconf lifc;
47257c478bd9Sstevel@tonic-gate # ifdef SIOCGLIFNUM
47267c478bd9Sstevel@tonic-gate struct lifnum lifn;
47277c478bd9Sstevel@tonic-gate # endif /* SIOCGLIFNUM */
47287c478bd9Sstevel@tonic-gate
47297c478bd9Sstevel@tonic-gate s = socket(InetMode, SOCK_DGRAM, 0);
47307c478bd9Sstevel@tonic-gate if (s == -1)
47317c478bd9Sstevel@tonic-gate return;
47327c478bd9Sstevel@tonic-gate
47337c478bd9Sstevel@tonic-gate /* get the list of known IP address from the kernel */
47347c478bd9Sstevel@tonic-gate # ifdef __hpux
47357c478bd9Sstevel@tonic-gate i = ioctl(s, SIOCGIFNUM, (char *) &numifs);
47367c478bd9Sstevel@tonic-gate # endif /* __hpux */
47377c478bd9Sstevel@tonic-gate # ifdef SIOCGLIFNUM
47387c478bd9Sstevel@tonic-gate lifn.lifn_family = AF_UNSPEC;
47397c478bd9Sstevel@tonic-gate lifn.lifn_flags = 0;
47407c478bd9Sstevel@tonic-gate i = ioctl(s, SIOCGLIFNUM, (char *)&lifn);
47417c478bd9Sstevel@tonic-gate numifs = lifn.lifn_count;
47427c478bd9Sstevel@tonic-gate # endif /* SIOCGLIFNUM */
47437c478bd9Sstevel@tonic-gate
47447c478bd9Sstevel@tonic-gate # if defined(__hpux) || defined(SIOCGLIFNUM)
47457c478bd9Sstevel@tonic-gate if (i < 0)
47467c478bd9Sstevel@tonic-gate {
47477c478bd9Sstevel@tonic-gate /* can't get number of interfaces -- fall back */
47487c478bd9Sstevel@tonic-gate if (tTd(0, 4))
47497c478bd9Sstevel@tonic-gate sm_dprintf("SIOCGLIFNUM failed: %s\n",
47507c478bd9Sstevel@tonic-gate sm_errstring(errno));
47517c478bd9Sstevel@tonic-gate numifs = -1;
47527c478bd9Sstevel@tonic-gate }
47537c478bd9Sstevel@tonic-gate else if (tTd(0, 42))
47547c478bd9Sstevel@tonic-gate sm_dprintf("system has %d interfaces\n", numifs);
47557c478bd9Sstevel@tonic-gate if (numifs < 0)
47567c478bd9Sstevel@tonic-gate # endif /* defined(__hpux) || defined(SIOCGLIFNUM) */
47577c478bd9Sstevel@tonic-gate numifs = MAXINTERFACES;
47587c478bd9Sstevel@tonic-gate
47597c478bd9Sstevel@tonic-gate if (numifs <= 0)
47607c478bd9Sstevel@tonic-gate {
47617c478bd9Sstevel@tonic-gate (void) close(s);
47627c478bd9Sstevel@tonic-gate return;
47637c478bd9Sstevel@tonic-gate }
47647c478bd9Sstevel@tonic-gate
47657c478bd9Sstevel@tonic-gate len = lifc.lifc_len = numifs * sizeof(struct lifreq);
47667c478bd9Sstevel@tonic-gate buf = lifc.lifc_buf = xalloc(lifc.lifc_len);
47677c478bd9Sstevel@tonic-gate # ifndef __hpux
47687c478bd9Sstevel@tonic-gate lifc.lifc_family = AF_UNSPEC;
47697c478bd9Sstevel@tonic-gate lifc.lifc_flags = 0;
47707c478bd9Sstevel@tonic-gate # endif /* ! __hpux */
47717c478bd9Sstevel@tonic-gate if (ioctl(s, SIOCGLIFCONF, (char *)&lifc) < 0)
47727c478bd9Sstevel@tonic-gate {
47737c478bd9Sstevel@tonic-gate if (tTd(0, 4))
47747c478bd9Sstevel@tonic-gate sm_dprintf("SIOCGLIFCONF failed: %s\n",
47757c478bd9Sstevel@tonic-gate sm_errstring(errno));
47767c478bd9Sstevel@tonic-gate (void) close(s);
47777c478bd9Sstevel@tonic-gate sm_free(buf);
47787c478bd9Sstevel@tonic-gate return;
47797c478bd9Sstevel@tonic-gate }
47807c478bd9Sstevel@tonic-gate
47817c478bd9Sstevel@tonic-gate /* scan the list of IP address */
47827c478bd9Sstevel@tonic-gate if (tTd(0, 40))
47837c478bd9Sstevel@tonic-gate sm_dprintf("scanning for interface specific names, lifc_len=%ld\n",
47847c478bd9Sstevel@tonic-gate (long) len);
47857c478bd9Sstevel@tonic-gate
47867c478bd9Sstevel@tonic-gate for (i = 0; i < len && i >= 0; )
47877c478bd9Sstevel@tonic-gate {
47887c478bd9Sstevel@tonic-gate int flags;
47897c478bd9Sstevel@tonic-gate struct lifreq *ifr = (struct lifreq *)&buf[i];
47907c478bd9Sstevel@tonic-gate SOCKADDR *sa = (SOCKADDR *) &ifr->lifr_addr;
47917c478bd9Sstevel@tonic-gate int af = ifr->lifr_addr.ss_family;
47927c478bd9Sstevel@tonic-gate char *addr;
47937c478bd9Sstevel@tonic-gate char *name;
47947c478bd9Sstevel@tonic-gate struct in6_addr ia6;
47957c478bd9Sstevel@tonic-gate struct in_addr ia;
47967c478bd9Sstevel@tonic-gate # ifdef SIOCGLIFFLAGS
47977c478bd9Sstevel@tonic-gate struct lifreq ifrf;
47987c478bd9Sstevel@tonic-gate # endif /* SIOCGLIFFLAGS */
47997c478bd9Sstevel@tonic-gate char ip_addr[256];
48007c478bd9Sstevel@tonic-gate char buf6[INET6_ADDRSTRLEN];
48017c478bd9Sstevel@tonic-gate
48027c478bd9Sstevel@tonic-gate /*
48037c478bd9Sstevel@tonic-gate ** We must close and recreate the socket each time
48047c478bd9Sstevel@tonic-gate ** since we don't know what type of socket it is now
48057c478bd9Sstevel@tonic-gate ** (each status function may change it).
48067c478bd9Sstevel@tonic-gate */
48077c478bd9Sstevel@tonic-gate
48087c478bd9Sstevel@tonic-gate (void) close(s);
48097c478bd9Sstevel@tonic-gate
48107c478bd9Sstevel@tonic-gate s = socket(af, SOCK_DGRAM, 0);
48117c478bd9Sstevel@tonic-gate if (s == -1)
48127c478bd9Sstevel@tonic-gate {
48137c478bd9Sstevel@tonic-gate sm_free(buf); /* XXX */
48147c478bd9Sstevel@tonic-gate return;
48157c478bd9Sstevel@tonic-gate }
48167c478bd9Sstevel@tonic-gate
48177c478bd9Sstevel@tonic-gate /*
48187c478bd9Sstevel@tonic-gate ** If we don't have a complete ifr structure,
48197c478bd9Sstevel@tonic-gate ** don't try to use it.
48207c478bd9Sstevel@tonic-gate */
48217c478bd9Sstevel@tonic-gate
4822058561cbSjbeck if ((len - i) < sizeof(*ifr))
48237c478bd9Sstevel@tonic-gate break;
48247c478bd9Sstevel@tonic-gate
48257c478bd9Sstevel@tonic-gate # ifdef BSD4_4_SOCKADDR
4826058561cbSjbeck if (sa->sa.sa_len > sizeof(ifr->lifr_addr))
4827058561cbSjbeck i += sizeof(ifr->lifr_name) + sa->sa.sa_len;
48287c478bd9Sstevel@tonic-gate else
48297c478bd9Sstevel@tonic-gate # endif /* BSD4_4_SOCKADDR */
483049218d4fSjbeck # ifdef DEC
483149218d4fSjbeck /* fix for IPv6 size differences */
4832058561cbSjbeck i += sizeof(ifr->ifr_name) +
483349218d4fSjbeck max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
483449218d4fSjbeck # else /* DEC */
4835058561cbSjbeck i += sizeof(*ifr);
483649218d4fSjbeck # endif /* DEC */
48377c478bd9Sstevel@tonic-gate
48387c478bd9Sstevel@tonic-gate if (tTd(0, 20))
48397c478bd9Sstevel@tonic-gate sm_dprintf("%s\n", anynet_ntoa(sa));
48407c478bd9Sstevel@tonic-gate
48417c478bd9Sstevel@tonic-gate if (af != AF_INET && af != AF_INET6)
48427c478bd9Sstevel@tonic-gate continue;
48437c478bd9Sstevel@tonic-gate
48447c478bd9Sstevel@tonic-gate # ifdef SIOCGLIFFLAGS
48457c478bd9Sstevel@tonic-gate memset(&ifrf, '\0', sizeof(struct lifreq));
48467c478bd9Sstevel@tonic-gate (void) sm_strlcpy(ifrf.lifr_name, ifr->lifr_name,
48477c478bd9Sstevel@tonic-gate sizeof(ifrf.lifr_name));
48487c478bd9Sstevel@tonic-gate if (ioctl(s, SIOCGLIFFLAGS, (char *) &ifrf) < 0)
48497c478bd9Sstevel@tonic-gate {
48507c478bd9Sstevel@tonic-gate if (tTd(0, 4))
48517c478bd9Sstevel@tonic-gate sm_dprintf("SIOCGLIFFLAGS failed: %s\n",
48527c478bd9Sstevel@tonic-gate sm_errstring(errno));
48537c478bd9Sstevel@tonic-gate continue;
48547c478bd9Sstevel@tonic-gate }
48557c478bd9Sstevel@tonic-gate
48567c478bd9Sstevel@tonic-gate name = ifr->lifr_name;
48577c478bd9Sstevel@tonic-gate flags = ifrf.lifr_flags;
48587c478bd9Sstevel@tonic-gate
48597c478bd9Sstevel@tonic-gate if (tTd(0, 41))
48607c478bd9Sstevel@tonic-gate sm_dprintf("\tflags: %lx\n", (unsigned long) flags);
48617c478bd9Sstevel@tonic-gate
48627c478bd9Sstevel@tonic-gate if (!bitset(IFF_UP, flags))
48637c478bd9Sstevel@tonic-gate continue;
48647c478bd9Sstevel@tonic-gate # endif /* SIOCGLIFFLAGS */
48657c478bd9Sstevel@tonic-gate
48667c478bd9Sstevel@tonic-gate ip_addr[0] = '\0';
48677c478bd9Sstevel@tonic-gate
48687c478bd9Sstevel@tonic-gate /* extract IP address from the list*/
48697c478bd9Sstevel@tonic-gate switch (af)
48707c478bd9Sstevel@tonic-gate {
48717c478bd9Sstevel@tonic-gate case AF_INET6:
48727c478bd9Sstevel@tonic-gate # ifdef __KAME__
48737c478bd9Sstevel@tonic-gate /* convert into proper scoped address */
48747c478bd9Sstevel@tonic-gate if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) ||
48757c478bd9Sstevel@tonic-gate IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) &&
48767c478bd9Sstevel@tonic-gate sa->sin6.sin6_scope_id == 0)
48777c478bd9Sstevel@tonic-gate {
48787c478bd9Sstevel@tonic-gate struct in6_addr *ia6p;
48797c478bd9Sstevel@tonic-gate
48807c478bd9Sstevel@tonic-gate ia6p = &sa->sin6.sin6_addr;
48817c478bd9Sstevel@tonic-gate sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] |
48827c478bd9Sstevel@tonic-gate ((unsigned int)ia6p->s6_addr[2] << 8));
48837c478bd9Sstevel@tonic-gate ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0;
48847c478bd9Sstevel@tonic-gate }
48857c478bd9Sstevel@tonic-gate # endif /* __KAME__ */
48867c478bd9Sstevel@tonic-gate ia6 = sa->sin6.sin6_addr;
48877c478bd9Sstevel@tonic-gate if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
48887c478bd9Sstevel@tonic-gate {
4889058561cbSjbeck addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
48907c478bd9Sstevel@tonic-gate message("WARNING: interface %s is UP with %s address",
48917c478bd9Sstevel@tonic-gate name, addr == NULL ? "(NULL)" : addr);
48927c478bd9Sstevel@tonic-gate continue;
48937c478bd9Sstevel@tonic-gate }
48947c478bd9Sstevel@tonic-gate
48957c478bd9Sstevel@tonic-gate /* save IP address in text from */
4896058561cbSjbeck addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
48977c478bd9Sstevel@tonic-gate if (addr != NULL)
4898058561cbSjbeck (void) sm_snprintf(ip_addr, sizeof(ip_addr),
48997c478bd9Sstevel@tonic-gate "[%.*s]",
4900058561cbSjbeck (int) sizeof(ip_addr) - 3,
49017c478bd9Sstevel@tonic-gate addr);
49027c478bd9Sstevel@tonic-gate break;
49037c478bd9Sstevel@tonic-gate
49047c478bd9Sstevel@tonic-gate case AF_INET:
49057c478bd9Sstevel@tonic-gate ia = sa->sin.sin_addr;
49067c478bd9Sstevel@tonic-gate if (ia.s_addr == INADDR_ANY ||
49077c478bd9Sstevel@tonic-gate ia.s_addr == INADDR_NONE)
49087c478bd9Sstevel@tonic-gate {
49097c478bd9Sstevel@tonic-gate message("WARNING: interface %s is UP with %s address",
49107c478bd9Sstevel@tonic-gate name, inet_ntoa(ia));
49117c478bd9Sstevel@tonic-gate continue;
49127c478bd9Sstevel@tonic-gate }
49137c478bd9Sstevel@tonic-gate
49147c478bd9Sstevel@tonic-gate /* save IP address in text from */
4915058561cbSjbeck (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]",
4916058561cbSjbeck (int) sizeof(ip_addr) - 3, inet_ntoa(ia));
49177c478bd9Sstevel@tonic-gate break;
49187c478bd9Sstevel@tonic-gate }
49197c478bd9Sstevel@tonic-gate
49207c478bd9Sstevel@tonic-gate if (*ip_addr == '\0')
49217c478bd9Sstevel@tonic-gate continue;
49227c478bd9Sstevel@tonic-gate
49237c478bd9Sstevel@tonic-gate if (!wordinclass(ip_addr, 'w'))
49247c478bd9Sstevel@tonic-gate {
49257c478bd9Sstevel@tonic-gate setclass('w', ip_addr);
49267c478bd9Sstevel@tonic-gate if (tTd(0, 4))
49277c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s\n", ip_addr);
49287c478bd9Sstevel@tonic-gate }
49297c478bd9Sstevel@tonic-gate
49307c478bd9Sstevel@tonic-gate # ifdef SIOCGLIFFLAGS
49317c478bd9Sstevel@tonic-gate /* skip "loopback" interface "lo" */
49327c478bd9Sstevel@tonic-gate if (DontProbeInterfaces == DPI_SKIPLOOPBACK &&
49337c478bd9Sstevel@tonic-gate bitset(IFF_LOOPBACK, flags))
49347c478bd9Sstevel@tonic-gate continue;
49357c478bd9Sstevel@tonic-gate # endif /* SIOCGLIFFLAGS */
49367c478bd9Sstevel@tonic-gate (void) add_hostnames(sa);
49377c478bd9Sstevel@tonic-gate }
49387c478bd9Sstevel@tonic-gate sm_free(buf); /* XXX */
49397c478bd9Sstevel@tonic-gate (void) close(s);
49407c478bd9Sstevel@tonic-gate # else /* NETINET6 && defined(SIOCGLIFCONF) */
49417c478bd9Sstevel@tonic-gate # if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN
49427c478bd9Sstevel@tonic-gate int s;
49437c478bd9Sstevel@tonic-gate int i;
49447c478bd9Sstevel@tonic-gate struct ifconf ifc;
49457c478bd9Sstevel@tonic-gate int numifs;
49467c478bd9Sstevel@tonic-gate
49477c478bd9Sstevel@tonic-gate s = socket(AF_INET, SOCK_DGRAM, 0);
49487c478bd9Sstevel@tonic-gate if (s == -1)
49497c478bd9Sstevel@tonic-gate return;
49507c478bd9Sstevel@tonic-gate
49517c478bd9Sstevel@tonic-gate /* get the list of known IP address from the kernel */
49527c478bd9Sstevel@tonic-gate # if defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN
49537c478bd9Sstevel@tonic-gate if (ioctl(s, SIOCGIFNUM, (char *) &numifs) < 0)
49547c478bd9Sstevel@tonic-gate {
49557c478bd9Sstevel@tonic-gate /* can't get number of interfaces -- fall back */
49567c478bd9Sstevel@tonic-gate if (tTd(0, 4))
49577c478bd9Sstevel@tonic-gate sm_dprintf("SIOCGIFNUM failed: %s\n",
49587c478bd9Sstevel@tonic-gate sm_errstring(errno));
49597c478bd9Sstevel@tonic-gate numifs = -1;
49607c478bd9Sstevel@tonic-gate }
49617c478bd9Sstevel@tonic-gate else if (tTd(0, 42))
49627c478bd9Sstevel@tonic-gate sm_dprintf("system has %d interfaces\n", numifs);
49637c478bd9Sstevel@tonic-gate if (numifs < 0)
49647c478bd9Sstevel@tonic-gate # endif /* defined(SIOCGIFNUM) && !SIOCGIFNUM_IS_BROKEN */
49657c478bd9Sstevel@tonic-gate numifs = MAXINTERFACES;
49667c478bd9Sstevel@tonic-gate
49677c478bd9Sstevel@tonic-gate if (numifs <= 0)
49687c478bd9Sstevel@tonic-gate {
49697c478bd9Sstevel@tonic-gate (void) close(s);
49707c478bd9Sstevel@tonic-gate return;
49717c478bd9Sstevel@tonic-gate }
49727c478bd9Sstevel@tonic-gate ifc.ifc_len = numifs * sizeof(struct ifreq);
49737c478bd9Sstevel@tonic-gate ifc.ifc_buf = xalloc(ifc.ifc_len);
49747c478bd9Sstevel@tonic-gate if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0)
49757c478bd9Sstevel@tonic-gate {
49767c478bd9Sstevel@tonic-gate if (tTd(0, 4))
49777c478bd9Sstevel@tonic-gate sm_dprintf("SIOCGIFCONF failed: %s\n",
49787c478bd9Sstevel@tonic-gate sm_errstring(errno));
49797c478bd9Sstevel@tonic-gate (void) close(s);
49807c478bd9Sstevel@tonic-gate return;
49817c478bd9Sstevel@tonic-gate }
49827c478bd9Sstevel@tonic-gate
49837c478bd9Sstevel@tonic-gate /* scan the list of IP address */
49847c478bd9Sstevel@tonic-gate if (tTd(0, 40))
49857c478bd9Sstevel@tonic-gate sm_dprintf("scanning for interface specific names, ifc_len=%d\n",
49867c478bd9Sstevel@tonic-gate ifc.ifc_len);
49877c478bd9Sstevel@tonic-gate
49887c478bd9Sstevel@tonic-gate for (i = 0; i < ifc.ifc_len && i >= 0; )
49897c478bd9Sstevel@tonic-gate {
49907c478bd9Sstevel@tonic-gate int af;
49917c478bd9Sstevel@tonic-gate struct ifreq *ifr = (struct ifreq *) &ifc.ifc_buf[i];
49927c478bd9Sstevel@tonic-gate SOCKADDR *sa = (SOCKADDR *) &ifr->ifr_addr;
49937c478bd9Sstevel@tonic-gate # if NETINET6
49947c478bd9Sstevel@tonic-gate char *addr;
49957c478bd9Sstevel@tonic-gate struct in6_addr ia6;
49967c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
49977c478bd9Sstevel@tonic-gate struct in_addr ia;
49987c478bd9Sstevel@tonic-gate # ifdef SIOCGIFFLAGS
49997c478bd9Sstevel@tonic-gate struct ifreq ifrf;
50007c478bd9Sstevel@tonic-gate # endif /* SIOCGIFFLAGS */
50017c478bd9Sstevel@tonic-gate char ip_addr[256];
50027c478bd9Sstevel@tonic-gate # if NETINET6
50037c478bd9Sstevel@tonic-gate char buf6[INET6_ADDRSTRLEN];
50047c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
50057c478bd9Sstevel@tonic-gate
50067c478bd9Sstevel@tonic-gate /*
50077c478bd9Sstevel@tonic-gate ** If we don't have a complete ifr structure,
50087c478bd9Sstevel@tonic-gate ** don't try to use it.
50097c478bd9Sstevel@tonic-gate */
50107c478bd9Sstevel@tonic-gate
5011058561cbSjbeck if ((ifc.ifc_len - i) < sizeof(*ifr))
50127c478bd9Sstevel@tonic-gate break;
50137c478bd9Sstevel@tonic-gate
50147c478bd9Sstevel@tonic-gate # ifdef BSD4_4_SOCKADDR
5015058561cbSjbeck if (sa->sa.sa_len > sizeof(ifr->ifr_addr))
5016058561cbSjbeck i += sizeof(ifr->ifr_name) + sa->sa.sa_len;
50177c478bd9Sstevel@tonic-gate else
50187c478bd9Sstevel@tonic-gate # endif /* BSD4_4_SOCKADDR */
5019058561cbSjbeck i += sizeof(*ifr);
50207c478bd9Sstevel@tonic-gate
50217c478bd9Sstevel@tonic-gate if (tTd(0, 20))
50227c478bd9Sstevel@tonic-gate sm_dprintf("%s\n", anynet_ntoa(sa));
50237c478bd9Sstevel@tonic-gate
50247c478bd9Sstevel@tonic-gate af = ifr->ifr_addr.sa_family;
50257c478bd9Sstevel@tonic-gate if (af != AF_INET
50267c478bd9Sstevel@tonic-gate # if NETINET6
50277c478bd9Sstevel@tonic-gate && af != AF_INET6
50287c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
50297c478bd9Sstevel@tonic-gate )
50307c478bd9Sstevel@tonic-gate continue;
50317c478bd9Sstevel@tonic-gate
50327c478bd9Sstevel@tonic-gate # ifdef SIOCGIFFLAGS
50337c478bd9Sstevel@tonic-gate memset(&ifrf, '\0', sizeof(struct ifreq));
50347c478bd9Sstevel@tonic-gate (void) sm_strlcpy(ifrf.ifr_name, ifr->ifr_name,
50357c478bd9Sstevel@tonic-gate sizeof(ifrf.ifr_name));
50367c478bd9Sstevel@tonic-gate (void) ioctl(s, SIOCGIFFLAGS, (char *) &ifrf);
50377c478bd9Sstevel@tonic-gate if (tTd(0, 41))
50387c478bd9Sstevel@tonic-gate sm_dprintf("\tflags: %lx\n",
50397c478bd9Sstevel@tonic-gate (unsigned long) ifrf.ifr_flags);
50407c478bd9Sstevel@tonic-gate # define IFRFREF ifrf
50417c478bd9Sstevel@tonic-gate # else /* SIOCGIFFLAGS */
50427c478bd9Sstevel@tonic-gate # define IFRFREF (*ifr)
50437c478bd9Sstevel@tonic-gate # endif /* SIOCGIFFLAGS */
50447c478bd9Sstevel@tonic-gate
50457c478bd9Sstevel@tonic-gate if (!bitset(IFF_UP, IFRFREF.ifr_flags))
50467c478bd9Sstevel@tonic-gate continue;
50477c478bd9Sstevel@tonic-gate
50487c478bd9Sstevel@tonic-gate ip_addr[0] = '\0';
50497c478bd9Sstevel@tonic-gate
50507c478bd9Sstevel@tonic-gate /* extract IP address from the list*/
50517c478bd9Sstevel@tonic-gate switch (af)
50527c478bd9Sstevel@tonic-gate {
50537c478bd9Sstevel@tonic-gate case AF_INET:
50547c478bd9Sstevel@tonic-gate ia = sa->sin.sin_addr;
50557c478bd9Sstevel@tonic-gate if (ia.s_addr == INADDR_ANY ||
50567c478bd9Sstevel@tonic-gate ia.s_addr == INADDR_NONE)
50577c478bd9Sstevel@tonic-gate {
50587c478bd9Sstevel@tonic-gate message("WARNING: interface %s is UP with %s address",
50597c478bd9Sstevel@tonic-gate ifr->ifr_name, inet_ntoa(ia));
50607c478bd9Sstevel@tonic-gate continue;
50617c478bd9Sstevel@tonic-gate }
50627c478bd9Sstevel@tonic-gate
50637c478bd9Sstevel@tonic-gate /* save IP address in text from */
5064058561cbSjbeck (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]",
5065058561cbSjbeck (int) sizeof(ip_addr) - 3,
50667c478bd9Sstevel@tonic-gate inet_ntoa(ia));
50677c478bd9Sstevel@tonic-gate break;
50687c478bd9Sstevel@tonic-gate
50697c478bd9Sstevel@tonic-gate # if NETINET6
50707c478bd9Sstevel@tonic-gate case AF_INET6:
50717c478bd9Sstevel@tonic-gate # ifdef __KAME__
50727c478bd9Sstevel@tonic-gate /* convert into proper scoped address */
50737c478bd9Sstevel@tonic-gate if ((IN6_IS_ADDR_LINKLOCAL(&sa->sin6.sin6_addr) ||
50747c478bd9Sstevel@tonic-gate IN6_IS_ADDR_SITELOCAL(&sa->sin6.sin6_addr)) &&
50757c478bd9Sstevel@tonic-gate sa->sin6.sin6_scope_id == 0)
50767c478bd9Sstevel@tonic-gate {
50777c478bd9Sstevel@tonic-gate struct in6_addr *ia6p;
50787c478bd9Sstevel@tonic-gate
50797c478bd9Sstevel@tonic-gate ia6p = &sa->sin6.sin6_addr;
50807c478bd9Sstevel@tonic-gate sa->sin6.sin6_scope_id = ntohs(ia6p->s6_addr[3] |
50817c478bd9Sstevel@tonic-gate ((unsigned int)ia6p->s6_addr[2] << 8));
50827c478bd9Sstevel@tonic-gate ia6p->s6_addr[2] = ia6p->s6_addr[3] = 0;
50837c478bd9Sstevel@tonic-gate }
50847c478bd9Sstevel@tonic-gate # endif /* __KAME__ */
50857c478bd9Sstevel@tonic-gate ia6 = sa->sin6.sin6_addr;
50867c478bd9Sstevel@tonic-gate if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
50877c478bd9Sstevel@tonic-gate {
5088058561cbSjbeck addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
50897c478bd9Sstevel@tonic-gate message("WARNING: interface %s is UP with %s address",
50907c478bd9Sstevel@tonic-gate ifr->ifr_name,
50917c478bd9Sstevel@tonic-gate addr == NULL ? "(NULL)" : addr);
50927c478bd9Sstevel@tonic-gate continue;
50937c478bd9Sstevel@tonic-gate }
50947c478bd9Sstevel@tonic-gate
50957c478bd9Sstevel@tonic-gate /* save IP address in text from */
5096058561cbSjbeck addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
50977c478bd9Sstevel@tonic-gate if (addr != NULL)
5098058561cbSjbeck (void) sm_snprintf(ip_addr, sizeof(ip_addr),
50997c478bd9Sstevel@tonic-gate "[%.*s]",
5100058561cbSjbeck (int) sizeof(ip_addr) - 3,
51017c478bd9Sstevel@tonic-gate addr);
51027c478bd9Sstevel@tonic-gate break;
51037c478bd9Sstevel@tonic-gate
51047c478bd9Sstevel@tonic-gate # endif /* NETINET6 */
51057c478bd9Sstevel@tonic-gate }
51067c478bd9Sstevel@tonic-gate
51077c478bd9Sstevel@tonic-gate if (ip_addr[0] == '\0')
51087c478bd9Sstevel@tonic-gate continue;
51097c478bd9Sstevel@tonic-gate
51107c478bd9Sstevel@tonic-gate if (!wordinclass(ip_addr, 'w'))
51117c478bd9Sstevel@tonic-gate {
51127c478bd9Sstevel@tonic-gate setclass('w', ip_addr);
51137c478bd9Sstevel@tonic-gate if (tTd(0, 4))
51147c478bd9Sstevel@tonic-gate sm_dprintf("\ta.k.a.: %s\n", ip_addr);
51157c478bd9Sstevel@tonic-gate }
51167c478bd9Sstevel@tonic-gate
51177c478bd9Sstevel@tonic-gate /* skip "loopback" interface "lo" */
51187c478bd9Sstevel@tonic-gate if (DontProbeInterfaces == DPI_SKIPLOOPBACK &&
51197c478bd9Sstevel@tonic-gate bitset(IFF_LOOPBACK, IFRFREF.ifr_flags))
51207c478bd9Sstevel@tonic-gate continue;
51217c478bd9Sstevel@tonic-gate
51227c478bd9Sstevel@tonic-gate (void) add_hostnames(sa);
51237c478bd9Sstevel@tonic-gate }
51247c478bd9Sstevel@tonic-gate sm_free(ifc.ifc_buf); /* XXX */
51257c478bd9Sstevel@tonic-gate (void) close(s);
51267c478bd9Sstevel@tonic-gate # undef IFRFREF
51277c478bd9Sstevel@tonic-gate # endif /* defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN */
51287c478bd9Sstevel@tonic-gate # endif /* NETINET6 && defined(SIOCGLIFCONF) */
51297c478bd9Sstevel@tonic-gate }
51307c478bd9Sstevel@tonic-gate /*
51317c478bd9Sstevel@tonic-gate ** ISLOOPBACK -- is socket address in the loopback net?
51327c478bd9Sstevel@tonic-gate **
51337c478bd9Sstevel@tonic-gate ** Parameters:
51347c478bd9Sstevel@tonic-gate ** sa -- socket address.
51357c478bd9Sstevel@tonic-gate **
51367c478bd9Sstevel@tonic-gate ** Returns:
51377c478bd9Sstevel@tonic-gate ** true -- is socket address in the loopback net?
51387c478bd9Sstevel@tonic-gate ** false -- otherwise
51397c478bd9Sstevel@tonic-gate **
51407c478bd9Sstevel@tonic-gate */
51417c478bd9Sstevel@tonic-gate
51427c478bd9Sstevel@tonic-gate bool
isloopback(sa)51437c478bd9Sstevel@tonic-gate isloopback(sa)
51447c478bd9Sstevel@tonic-gate SOCKADDR sa;
51457c478bd9Sstevel@tonic-gate {
51467c478bd9Sstevel@tonic-gate #if NETINET6
51477c478bd9Sstevel@tonic-gate if (IN6_IS_ADDR_LOOPBACK(&sa.sin6.sin6_addr))
51487c478bd9Sstevel@tonic-gate return true;
51497c478bd9Sstevel@tonic-gate #else /* NETINET6 */
51507c478bd9Sstevel@tonic-gate /* XXX how to correctly extract IN_LOOPBACKNET part? */
51517c478bd9Sstevel@tonic-gate if (((ntohl(sa.sin.sin_addr.s_addr) & IN_CLASSA_NET)
51527c478bd9Sstevel@tonic-gate >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
51537c478bd9Sstevel@tonic-gate return true;
51547c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
51557c478bd9Sstevel@tonic-gate return false;
51567c478bd9Sstevel@tonic-gate }
51577c478bd9Sstevel@tonic-gate /*
51587c478bd9Sstevel@tonic-gate ** GET_NUM_PROCS_ONLINE -- return the number of processors currently online
51597c478bd9Sstevel@tonic-gate **
51607c478bd9Sstevel@tonic-gate ** Parameters:
51617c478bd9Sstevel@tonic-gate ** none.
51627c478bd9Sstevel@tonic-gate **
51637c478bd9Sstevel@tonic-gate ** Returns:
51647c478bd9Sstevel@tonic-gate ** The number of processors online.
51657c478bd9Sstevel@tonic-gate */
51667c478bd9Sstevel@tonic-gate
51677c478bd9Sstevel@tonic-gate static int
get_num_procs_online()51687c478bd9Sstevel@tonic-gate get_num_procs_online()
51697c478bd9Sstevel@tonic-gate {
51707c478bd9Sstevel@tonic-gate int nproc = 0;
51717c478bd9Sstevel@tonic-gate
51727c478bd9Sstevel@tonic-gate #ifdef USESYSCTL
51737c478bd9Sstevel@tonic-gate # if defined(CTL_HW) && defined(HW_NCPU)
51747c478bd9Sstevel@tonic-gate size_t sz;
51757c478bd9Sstevel@tonic-gate int mib[2];
51767c478bd9Sstevel@tonic-gate
51777c478bd9Sstevel@tonic-gate mib[0] = CTL_HW;
51787c478bd9Sstevel@tonic-gate mib[1] = HW_NCPU;
5179058561cbSjbeck sz = (size_t) sizeof(nproc);
51807c478bd9Sstevel@tonic-gate (void) sysctl(mib, 2, &nproc, &sz, NULL, 0);
51817c478bd9Sstevel@tonic-gate # endif /* defined(CTL_HW) && defined(HW_NCPU) */
51827c478bd9Sstevel@tonic-gate #else /* USESYSCTL */
51837c478bd9Sstevel@tonic-gate # ifdef _SC_NPROCESSORS_ONLN
51847c478bd9Sstevel@tonic-gate nproc = (int) sysconf(_SC_NPROCESSORS_ONLN);
51857c478bd9Sstevel@tonic-gate # else /* _SC_NPROCESSORS_ONLN */
51867c478bd9Sstevel@tonic-gate # ifdef __hpux
51877c478bd9Sstevel@tonic-gate # include <sys/pstat.h>
51887c478bd9Sstevel@tonic-gate struct pst_dynamic psd;
51897c478bd9Sstevel@tonic-gate
51907c478bd9Sstevel@tonic-gate if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1)
51917c478bd9Sstevel@tonic-gate nproc = psd.psd_proc_cnt;
51927c478bd9Sstevel@tonic-gate # endif /* __hpux */
51937c478bd9Sstevel@tonic-gate # endif /* _SC_NPROCESSORS_ONLN */
51947c478bd9Sstevel@tonic-gate #endif /* USESYSCTL */
51957c478bd9Sstevel@tonic-gate
51967c478bd9Sstevel@tonic-gate if (nproc <= 0)
51977c478bd9Sstevel@tonic-gate nproc = 1;
51987c478bd9Sstevel@tonic-gate return nproc;
51997c478bd9Sstevel@tonic-gate }
52007c478bd9Sstevel@tonic-gate /*
52017c478bd9Sstevel@tonic-gate ** SM_CLOSEFROM -- close file descriptors
52027c478bd9Sstevel@tonic-gate **
52037c478bd9Sstevel@tonic-gate ** Parameters:
52047c478bd9Sstevel@tonic-gate ** lowest -- first fd to close
52057c478bd9Sstevel@tonic-gate ** highest -- last fd + 1 to close
52067c478bd9Sstevel@tonic-gate **
52077c478bd9Sstevel@tonic-gate ** Returns:
52087c478bd9Sstevel@tonic-gate ** none
52097c478bd9Sstevel@tonic-gate */
52107c478bd9Sstevel@tonic-gate
52117c478bd9Sstevel@tonic-gate void
sm_closefrom(lowest,highest)52127c478bd9Sstevel@tonic-gate sm_closefrom(lowest, highest)
52137c478bd9Sstevel@tonic-gate int lowest, highest;
52147c478bd9Sstevel@tonic-gate {
52157c478bd9Sstevel@tonic-gate #if HASCLOSEFROM
52167c478bd9Sstevel@tonic-gate closefrom(lowest);
52177c478bd9Sstevel@tonic-gate #else /* HASCLOSEFROM */
52187c478bd9Sstevel@tonic-gate int i;
52197c478bd9Sstevel@tonic-gate
52207c478bd9Sstevel@tonic-gate for (i = lowest; i < highest; i++)
52217c478bd9Sstevel@tonic-gate (void) close(i);
52227c478bd9Sstevel@tonic-gate #endif /* HASCLOSEFROM */
52237c478bd9Sstevel@tonic-gate }
52247c478bd9Sstevel@tonic-gate #if HASFDWALK
52257c478bd9Sstevel@tonic-gate /*
52267c478bd9Sstevel@tonic-gate ** CLOSEFD_WALK -- walk fd's arranging to close them
52277c478bd9Sstevel@tonic-gate ** Callback for fdwalk()
52287c478bd9Sstevel@tonic-gate **
52297c478bd9Sstevel@tonic-gate ** Parameters:
52307c478bd9Sstevel@tonic-gate ** lowest -- first fd to arrange to be closed
52317c478bd9Sstevel@tonic-gate ** fd -- fd to arrange to be closed
52327c478bd9Sstevel@tonic-gate **
52337c478bd9Sstevel@tonic-gate ** Returns:
52347c478bd9Sstevel@tonic-gate ** zero
52357c478bd9Sstevel@tonic-gate */
52367c478bd9Sstevel@tonic-gate
52377c478bd9Sstevel@tonic-gate static int
closefd_walk(lowest,fd)52387c478bd9Sstevel@tonic-gate closefd_walk(lowest, fd)
52397c478bd9Sstevel@tonic-gate void *lowest;
52407c478bd9Sstevel@tonic-gate int fd;
52417c478bd9Sstevel@tonic-gate {
52427c478bd9Sstevel@tonic-gate if (fd >= *(int *)lowest)
52437c478bd9Sstevel@tonic-gate (void) fcntl(fd, F_SETFD, FD_CLOEXEC);
52447c478bd9Sstevel@tonic-gate return 0;
52457c478bd9Sstevel@tonic-gate }
52467c478bd9Sstevel@tonic-gate #endif /* HASFDWALK */
52477c478bd9Sstevel@tonic-gate /*
52487c478bd9Sstevel@tonic-gate ** SM_CLOSE_ON_EXEC -- arrange for file descriptors to be closed
52497c478bd9Sstevel@tonic-gate **
52507c478bd9Sstevel@tonic-gate ** Parameters:
52517c478bd9Sstevel@tonic-gate ** lowest -- first fd to arrange to be closed
52527c478bd9Sstevel@tonic-gate ** highest -- last fd + 1 to arrange to be closed
52537c478bd9Sstevel@tonic-gate **
52547c478bd9Sstevel@tonic-gate ** Returns:
52557c478bd9Sstevel@tonic-gate ** none
52567c478bd9Sstevel@tonic-gate */
52577c478bd9Sstevel@tonic-gate
52587c478bd9Sstevel@tonic-gate void
sm_close_on_exec(highest,lowest)52597c478bd9Sstevel@tonic-gate sm_close_on_exec(highest, lowest)
52607c478bd9Sstevel@tonic-gate int highest, lowest;
52617c478bd9Sstevel@tonic-gate {
52627c478bd9Sstevel@tonic-gate #if HASFDWALK
52637c478bd9Sstevel@tonic-gate (void) fdwalk(closefd_walk, &lowest);
52647c478bd9Sstevel@tonic-gate #else /* HASFDWALK */
52657c478bd9Sstevel@tonic-gate int i, j;
52667c478bd9Sstevel@tonic-gate
52677c478bd9Sstevel@tonic-gate for (i = lowest; i < highest; i++)
52687c478bd9Sstevel@tonic-gate {
52697c478bd9Sstevel@tonic-gate if ((j = fcntl(i, F_GETFD, 0)) != -1)
52707c478bd9Sstevel@tonic-gate (void) fcntl(i, F_SETFD, j | FD_CLOEXEC);
52717c478bd9Sstevel@tonic-gate }
52727c478bd9Sstevel@tonic-gate #endif /* HASFDWALK */
52737c478bd9Sstevel@tonic-gate }
52747c478bd9Sstevel@tonic-gate /*
52757c478bd9Sstevel@tonic-gate ** SEED_RANDOM -- seed the random number generator
52767c478bd9Sstevel@tonic-gate **
52777c478bd9Sstevel@tonic-gate ** Parameters:
52787c478bd9Sstevel@tonic-gate ** none
52797c478bd9Sstevel@tonic-gate **
52807c478bd9Sstevel@tonic-gate ** Returns:
52817c478bd9Sstevel@tonic-gate ** none
52827c478bd9Sstevel@tonic-gate */
52837c478bd9Sstevel@tonic-gate
52847c478bd9Sstevel@tonic-gate void
seed_random()52857c478bd9Sstevel@tonic-gate seed_random()
52867c478bd9Sstevel@tonic-gate {
52877c478bd9Sstevel@tonic-gate #if HASSRANDOMDEV
52887c478bd9Sstevel@tonic-gate srandomdev();
52897c478bd9Sstevel@tonic-gate #else /* HASSRANDOMDEV */
52907c478bd9Sstevel@tonic-gate long seed;
52917c478bd9Sstevel@tonic-gate struct timeval t;
52927c478bd9Sstevel@tonic-gate
52937c478bd9Sstevel@tonic-gate seed = (long) CurrentPid;
52947c478bd9Sstevel@tonic-gate if (gettimeofday(&t, NULL) >= 0)
52957c478bd9Sstevel@tonic-gate seed += t.tv_sec + t.tv_usec;
52967c478bd9Sstevel@tonic-gate
52977c478bd9Sstevel@tonic-gate # if HASRANDOM
52987c478bd9Sstevel@tonic-gate (void) srandom(seed);
52997c478bd9Sstevel@tonic-gate # else /* HASRANDOM */
53007c478bd9Sstevel@tonic-gate (void) srand((unsigned int) seed);
53017c478bd9Sstevel@tonic-gate # endif /* HASRANDOM */
53027c478bd9Sstevel@tonic-gate #endif /* HASSRANDOMDEV */
53037c478bd9Sstevel@tonic-gate }
53047c478bd9Sstevel@tonic-gate /*
53057c478bd9Sstevel@tonic-gate ** SM_SYSLOG -- syslog wrapper to keep messages under SYSLOG_BUFSIZE
53067c478bd9Sstevel@tonic-gate **
53077c478bd9Sstevel@tonic-gate ** Parameters:
53087c478bd9Sstevel@tonic-gate ** level -- syslog level
53097c478bd9Sstevel@tonic-gate ** id -- envelope ID or NULL (NOQUEUE)
53107c478bd9Sstevel@tonic-gate ** fmt -- format string
53117c478bd9Sstevel@tonic-gate ** arg... -- arguments as implied by fmt.
53127c478bd9Sstevel@tonic-gate **
53137c478bd9Sstevel@tonic-gate ** Returns:
53147c478bd9Sstevel@tonic-gate ** none
53157c478bd9Sstevel@tonic-gate */
53167c478bd9Sstevel@tonic-gate
53177c478bd9Sstevel@tonic-gate /* VARARGS3 */
53187c478bd9Sstevel@tonic-gate void
53197c478bd9Sstevel@tonic-gate #ifdef __STDC__
sm_syslog(int level,const char * id,const char * fmt,...)53207c478bd9Sstevel@tonic-gate sm_syslog(int level, const char *id, const char *fmt, ...)
53217c478bd9Sstevel@tonic-gate #else /* __STDC__ */
53227c478bd9Sstevel@tonic-gate sm_syslog(level, id, fmt, va_alist)
53237c478bd9Sstevel@tonic-gate int level;
53247c478bd9Sstevel@tonic-gate const char *id;
53257c478bd9Sstevel@tonic-gate const char *fmt;
53267c478bd9Sstevel@tonic-gate va_dcl
53277c478bd9Sstevel@tonic-gate #endif /* __STDC__ */
53287c478bd9Sstevel@tonic-gate {
5329445f2479Sjbeck char *buf;
5330445f2479Sjbeck size_t bufsize;
53317c478bd9Sstevel@tonic-gate char *begin, *end;
53327c478bd9Sstevel@tonic-gate int save_errno;
53337c478bd9Sstevel@tonic-gate int seq = 1;
53347c478bd9Sstevel@tonic-gate int idlen;
53357c478bd9Sstevel@tonic-gate char buf0[MAXLINE];
53367c478bd9Sstevel@tonic-gate char *newstring;
53377c478bd9Sstevel@tonic-gate extern int SyslogPrefixLen;
53387c478bd9Sstevel@tonic-gate SM_VA_LOCAL_DECL
53397c478bd9Sstevel@tonic-gate
53407c478bd9Sstevel@tonic-gate save_errno = errno;
53417c478bd9Sstevel@tonic-gate if (id == NULL)
53427c478bd9Sstevel@tonic-gate id = "NOQUEUE";
53437c478bd9Sstevel@tonic-gate idlen = strlen(id) + SyslogPrefixLen;
53447c478bd9Sstevel@tonic-gate
53457c478bd9Sstevel@tonic-gate buf = buf0;
5346058561cbSjbeck bufsize = sizeof(buf0);
53477c478bd9Sstevel@tonic-gate
53487c478bd9Sstevel@tonic-gate for (;;)
53497c478bd9Sstevel@tonic-gate {
53507c478bd9Sstevel@tonic-gate int n;
53517c478bd9Sstevel@tonic-gate
53527c478bd9Sstevel@tonic-gate /* print log message into buf */
53537c478bd9Sstevel@tonic-gate SM_VA_START(ap, fmt);
53547c478bd9Sstevel@tonic-gate n = sm_vsnprintf(buf, bufsize, fmt, ap);
53557c478bd9Sstevel@tonic-gate SM_VA_END(ap);
53567c478bd9Sstevel@tonic-gate SM_ASSERT(n > 0);
53577c478bd9Sstevel@tonic-gate if (n < bufsize)
53587c478bd9Sstevel@tonic-gate break;
53597c478bd9Sstevel@tonic-gate
53607c478bd9Sstevel@tonic-gate /* String too small, redo with correct size */
53617c478bd9Sstevel@tonic-gate bufsize = n + 1;
53627c478bd9Sstevel@tonic-gate if (buf != buf0)
53637c478bd9Sstevel@tonic-gate {
53647c478bd9Sstevel@tonic-gate sm_free(buf);
53657c478bd9Sstevel@tonic-gate buf = NULL;
53667c478bd9Sstevel@tonic-gate }
53677c478bd9Sstevel@tonic-gate buf = sm_malloc_x(bufsize);
53687c478bd9Sstevel@tonic-gate }
53697c478bd9Sstevel@tonic-gate
53707c478bd9Sstevel@tonic-gate /* clean up buf after it has been expanded with args */
53717c478bd9Sstevel@tonic-gate newstring = str2prt(buf);
53727c478bd9Sstevel@tonic-gate if ((strlen(newstring) + idlen + 1) < SYSLOG_BUFSIZE)
53737c478bd9Sstevel@tonic-gate {
53747c478bd9Sstevel@tonic-gate #if LOG
53757c478bd9Sstevel@tonic-gate if (*id == '\0')
5376058561cbSjbeck {
5377058561cbSjbeck if (tTd(89, 8))
5378058561cbSjbeck sm_dprintf("%s\n", newstring);
5379058561cbSjbeck else
53807c478bd9Sstevel@tonic-gate syslog(level, "%s", newstring);
5381058561cbSjbeck }
5382058561cbSjbeck else
5383058561cbSjbeck {
5384058561cbSjbeck if (tTd(89, 8))
5385058561cbSjbeck sm_dprintf("%s: %s\n", id, newstring);
53867c478bd9Sstevel@tonic-gate else
53877c478bd9Sstevel@tonic-gate syslog(level, "%s: %s", id, newstring);
5388058561cbSjbeck }
53897c478bd9Sstevel@tonic-gate #else /* LOG */
53907c478bd9Sstevel@tonic-gate /*XXX should do something more sensible */
53917c478bd9Sstevel@tonic-gate if (*id == '\0')
53927c478bd9Sstevel@tonic-gate (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT, "%s\n",
53937c478bd9Sstevel@tonic-gate newstring);
53947c478bd9Sstevel@tonic-gate else
53957c478bd9Sstevel@tonic-gate (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
53967c478bd9Sstevel@tonic-gate "%s: %s\n", id, newstring);
53977c478bd9Sstevel@tonic-gate #endif /* LOG */
5398445f2479Sjbeck if (buf != buf0)
5399445f2479Sjbeck sm_free(buf);
54007c478bd9Sstevel@tonic-gate errno = save_errno;
54017c478bd9Sstevel@tonic-gate return;
54027c478bd9Sstevel@tonic-gate }
54037c478bd9Sstevel@tonic-gate
54047c478bd9Sstevel@tonic-gate /*
54057c478bd9Sstevel@tonic-gate ** additional length for splitting: " ..." + 3, where 3 is magic to
54067c478bd9Sstevel@tonic-gate ** have some data for the next entry.
54077c478bd9Sstevel@tonic-gate */
54087c478bd9Sstevel@tonic-gate
54097c478bd9Sstevel@tonic-gate #define SL_SPLIT 7
54107c478bd9Sstevel@tonic-gate
54117c478bd9Sstevel@tonic-gate begin = newstring;
54127c478bd9Sstevel@tonic-gate idlen += 5; /* strlen("[999]"), see below */
54137c478bd9Sstevel@tonic-gate while (*begin != '\0' &&
54147c478bd9Sstevel@tonic-gate (strlen(begin) + idlen) > SYSLOG_BUFSIZE)
54157c478bd9Sstevel@tonic-gate {
54167c478bd9Sstevel@tonic-gate char save;
54177c478bd9Sstevel@tonic-gate
54187c478bd9Sstevel@tonic-gate if (seq >= 999)
54197c478bd9Sstevel@tonic-gate {
54207c478bd9Sstevel@tonic-gate /* Too many messages */
54217c478bd9Sstevel@tonic-gate break;
54227c478bd9Sstevel@tonic-gate }
54237c478bd9Sstevel@tonic-gate end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT;
54247c478bd9Sstevel@tonic-gate while (end > begin)
54257c478bd9Sstevel@tonic-gate {
54267c478bd9Sstevel@tonic-gate /* Break on comma or space */
54277c478bd9Sstevel@tonic-gate if (*end == ',' || *end == ' ')
54287c478bd9Sstevel@tonic-gate {
54297c478bd9Sstevel@tonic-gate end++; /* Include separator */
54307c478bd9Sstevel@tonic-gate break;
54317c478bd9Sstevel@tonic-gate }
54327c478bd9Sstevel@tonic-gate end--;
54337c478bd9Sstevel@tonic-gate }
54347c478bd9Sstevel@tonic-gate /* No separator, break midstring... */
54357c478bd9Sstevel@tonic-gate if (end == begin)
54367c478bd9Sstevel@tonic-gate end = begin + SYSLOG_BUFSIZE - idlen - SL_SPLIT;
54377c478bd9Sstevel@tonic-gate save = *end;
54387c478bd9Sstevel@tonic-gate *end = 0;
54397c478bd9Sstevel@tonic-gate #if LOG
5440058561cbSjbeck if (tTd(89, 8))
5441058561cbSjbeck sm_dprintf("%s[%d]: %s ...\n", id, seq++, begin);
5442058561cbSjbeck else
54437c478bd9Sstevel@tonic-gate syslog(level, "%s[%d]: %s ...", id, seq++, begin);
54447c478bd9Sstevel@tonic-gate #else /* LOG */
54457c478bd9Sstevel@tonic-gate (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
54467c478bd9Sstevel@tonic-gate "%s[%d]: %s ...\n", id, seq++, begin);
54477c478bd9Sstevel@tonic-gate #endif /* LOG */
54487c478bd9Sstevel@tonic-gate *end = save;
54497c478bd9Sstevel@tonic-gate begin = end;
54507c478bd9Sstevel@tonic-gate }
54517c478bd9Sstevel@tonic-gate if (seq >= 999)
5452058561cbSjbeck {
54537c478bd9Sstevel@tonic-gate #if LOG
5454058561cbSjbeck if (tTd(89, 8))
5455058561cbSjbeck sm_dprintf("%s[%d]: log terminated, too many parts\n",
5456058561cbSjbeck id, seq);
5457058561cbSjbeck else
54587c478bd9Sstevel@tonic-gate syslog(level, "%s[%d]: log terminated, too many parts",
54597c478bd9Sstevel@tonic-gate id, seq);
54607c478bd9Sstevel@tonic-gate #else /* LOG */
54617c478bd9Sstevel@tonic-gate (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
54627c478bd9Sstevel@tonic-gate "%s[%d]: log terminated, too many parts\n", id, seq);
54637c478bd9Sstevel@tonic-gate #endif /* LOG */
5464058561cbSjbeck }
54657c478bd9Sstevel@tonic-gate else if (*begin != '\0')
5466058561cbSjbeck {
54677c478bd9Sstevel@tonic-gate #if LOG
5468058561cbSjbeck if (tTd(89, 8))
5469058561cbSjbeck sm_dprintf("%s[%d]: %s\n", id, seq, begin);
5470058561cbSjbeck else
54717c478bd9Sstevel@tonic-gate syslog(level, "%s[%d]: %s", id, seq, begin);
54727c478bd9Sstevel@tonic-gate #else /* LOG */
54737c478bd9Sstevel@tonic-gate (void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
54747c478bd9Sstevel@tonic-gate "%s[%d]: %s\n", id, seq, begin);
54757c478bd9Sstevel@tonic-gate #endif /* LOG */
5476058561cbSjbeck }
5477445f2479Sjbeck if (buf != buf0)
5478445f2479Sjbeck sm_free(buf);
54797c478bd9Sstevel@tonic-gate errno = save_errno;
54807c478bd9Sstevel@tonic-gate }
54817c478bd9Sstevel@tonic-gate /*
54827c478bd9Sstevel@tonic-gate ** HARD_SYSLOG -- call syslog repeatedly until it works
54837c478bd9Sstevel@tonic-gate **
54847c478bd9Sstevel@tonic-gate ** Needed on HP-UX, which apparently doesn't guarantee that
54857c478bd9Sstevel@tonic-gate ** syslog succeeds during interrupt handlers.
54867c478bd9Sstevel@tonic-gate */
54877c478bd9Sstevel@tonic-gate
54887c478bd9Sstevel@tonic-gate #if defined(__hpux) && !defined(HPUX11)
54897c478bd9Sstevel@tonic-gate
54907c478bd9Sstevel@tonic-gate # define MAXSYSLOGTRIES 100
54917c478bd9Sstevel@tonic-gate # undef syslog
54927c478bd9Sstevel@tonic-gate # ifdef V4FS
54937c478bd9Sstevel@tonic-gate # define XCNST const
54947c478bd9Sstevel@tonic-gate # define CAST (const char *)
54957c478bd9Sstevel@tonic-gate # else /* V4FS */
54967c478bd9Sstevel@tonic-gate # define XCNST
54977c478bd9Sstevel@tonic-gate # define CAST
54987c478bd9Sstevel@tonic-gate # endif /* V4FS */
54997c478bd9Sstevel@tonic-gate
55007c478bd9Sstevel@tonic-gate void
55017c478bd9Sstevel@tonic-gate # ifdef __STDC__
hard_syslog(int pri,XCNST char * msg,...)55027c478bd9Sstevel@tonic-gate hard_syslog(int pri, XCNST char *msg, ...)
55037c478bd9Sstevel@tonic-gate # else /* __STDC__ */
55047c478bd9Sstevel@tonic-gate hard_syslog(pri, msg, va_alist)
55057c478bd9Sstevel@tonic-gate int pri;
55067c478bd9Sstevel@tonic-gate XCNST char *msg;
55077c478bd9Sstevel@tonic-gate va_dcl
55087c478bd9Sstevel@tonic-gate # endif /* __STDC__ */
55097c478bd9Sstevel@tonic-gate {
55107c478bd9Sstevel@tonic-gate int i;
55117c478bd9Sstevel@tonic-gate char buf[SYSLOG_BUFSIZE];
55127c478bd9Sstevel@tonic-gate SM_VA_LOCAL_DECL
55137c478bd9Sstevel@tonic-gate
55147c478bd9Sstevel@tonic-gate SM_VA_START(ap, msg);
5515058561cbSjbeck (void) sm_vsnprintf(buf, sizeof(buf), msg, ap);
55167c478bd9Sstevel@tonic-gate SM_VA_END(ap);
55177c478bd9Sstevel@tonic-gate
55187c478bd9Sstevel@tonic-gate for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; )
55197c478bd9Sstevel@tonic-gate continue;
55207c478bd9Sstevel@tonic-gate }
55217c478bd9Sstevel@tonic-gate
55227c478bd9Sstevel@tonic-gate # undef CAST
55237c478bd9Sstevel@tonic-gate #endif /* defined(__hpux) && !defined(HPUX11) */
55247c478bd9Sstevel@tonic-gate #if NEEDLOCAL_HOSTNAME_LENGTH
55257c478bd9Sstevel@tonic-gate /*
55267c478bd9Sstevel@tonic-gate ** LOCAL_HOSTNAME_LENGTH
55277c478bd9Sstevel@tonic-gate **
55287c478bd9Sstevel@tonic-gate ** This is required to get sendmail to compile against BIND 4.9.x
55297c478bd9Sstevel@tonic-gate ** on Ultrix.
55307c478bd9Sstevel@tonic-gate **
55317c478bd9Sstevel@tonic-gate ** Unfortunately, a Compaq Y2K patch kit provides it without
55327c478bd9Sstevel@tonic-gate ** bumping __RES in /usr/include/resolv.h so we can't automatically
55337c478bd9Sstevel@tonic-gate ** figure out whether it is needed.
55347c478bd9Sstevel@tonic-gate */
55357c478bd9Sstevel@tonic-gate
55367c478bd9Sstevel@tonic-gate int
local_hostname_length(hostname)55377c478bd9Sstevel@tonic-gate local_hostname_length(hostname)
55387c478bd9Sstevel@tonic-gate char *hostname;
55397c478bd9Sstevel@tonic-gate {
55407c478bd9Sstevel@tonic-gate size_t len_host, len_domain;
55417c478bd9Sstevel@tonic-gate
55427c478bd9Sstevel@tonic-gate if (!*_res.defdname)
55437c478bd9Sstevel@tonic-gate res_init();
55447c478bd9Sstevel@tonic-gate len_host = strlen(hostname);
55457c478bd9Sstevel@tonic-gate len_domain = strlen(_res.defdname);
55467c478bd9Sstevel@tonic-gate if (len_host > len_domain &&
55477c478bd9Sstevel@tonic-gate (sm_strcasecmp(hostname + len_host - len_domain,
55487c478bd9Sstevel@tonic-gate _res.defdname) == 0) &&
55497c478bd9Sstevel@tonic-gate hostname[len_host - len_domain - 1] == '.')
55507c478bd9Sstevel@tonic-gate return len_host - len_domain - 1;
55517c478bd9Sstevel@tonic-gate else
55527c478bd9Sstevel@tonic-gate return 0;
55537c478bd9Sstevel@tonic-gate }
55547c478bd9Sstevel@tonic-gate #endif /* NEEDLOCAL_HOSTNAME_LENGTH */
55557c478bd9Sstevel@tonic-gate
55567c478bd9Sstevel@tonic-gate #if NEEDLINK
55577c478bd9Sstevel@tonic-gate /*
55587c478bd9Sstevel@tonic-gate ** LINK -- clone a file
55597c478bd9Sstevel@tonic-gate **
55607c478bd9Sstevel@tonic-gate ** Some OS's lacks link() and hard links. Since sendmail is using
55617c478bd9Sstevel@tonic-gate ** link() as an efficient way to clone files, this implementation
55627c478bd9Sstevel@tonic-gate ** will simply do a file copy.
55637c478bd9Sstevel@tonic-gate **
55647c478bd9Sstevel@tonic-gate ** NOTE: This link() replacement is not a generic replacement as it
55657c478bd9Sstevel@tonic-gate ** does not handle all of the semantics of the real link(2).
55667c478bd9Sstevel@tonic-gate **
55677c478bd9Sstevel@tonic-gate ** Parameters:
55687c478bd9Sstevel@tonic-gate ** source -- pathname of existing file.
55697c478bd9Sstevel@tonic-gate ** target -- pathname of link (clone) to be created.
55707c478bd9Sstevel@tonic-gate **
55717c478bd9Sstevel@tonic-gate ** Returns:
55727c478bd9Sstevel@tonic-gate ** 0 -- success.
55737c478bd9Sstevel@tonic-gate ** -1 -- failure, see errno for details.
55747c478bd9Sstevel@tonic-gate */
55757c478bd9Sstevel@tonic-gate
55767c478bd9Sstevel@tonic-gate int
link(source,target)55777c478bd9Sstevel@tonic-gate link(source, target)
55787c478bd9Sstevel@tonic-gate const char *source;
55797c478bd9Sstevel@tonic-gate const char *target;
55807c478bd9Sstevel@tonic-gate {
55817c478bd9Sstevel@tonic-gate int save_errno;
55827c478bd9Sstevel@tonic-gate int sff;
55837c478bd9Sstevel@tonic-gate int src = -1, dst = -1;
55847c478bd9Sstevel@tonic-gate ssize_t readlen;
55857c478bd9Sstevel@tonic-gate ssize_t writelen;
55867c478bd9Sstevel@tonic-gate char buf[BUFSIZ];
55877c478bd9Sstevel@tonic-gate struct stat st;
55887c478bd9Sstevel@tonic-gate
55897c478bd9Sstevel@tonic-gate sff = SFF_REGONLY|SFF_OPENASROOT;
55907c478bd9Sstevel@tonic-gate if (DontLockReadFiles)
55917c478bd9Sstevel@tonic-gate sff |= SFF_NOLOCK;
55927c478bd9Sstevel@tonic-gate
55937c478bd9Sstevel@tonic-gate /* Open the original file */
55947c478bd9Sstevel@tonic-gate src = safeopen((char *)source, O_RDONLY, 0, sff);
55957c478bd9Sstevel@tonic-gate if (src < 0)
55967c478bd9Sstevel@tonic-gate goto fail;
55977c478bd9Sstevel@tonic-gate
55987c478bd9Sstevel@tonic-gate /* Obtain the size and the mode */
55997c478bd9Sstevel@tonic-gate if (fstat(src, &st) < 0)
56007c478bd9Sstevel@tonic-gate goto fail;
56017c478bd9Sstevel@tonic-gate
56027c478bd9Sstevel@tonic-gate /* Create the duplicate copy */
56037c478bd9Sstevel@tonic-gate sff &= ~SFF_NOLOCK;
56047c478bd9Sstevel@tonic-gate sff |= SFF_CREAT;
56057c478bd9Sstevel@tonic-gate dst = safeopen((char *)target, O_CREAT|O_EXCL|O_WRONLY,
56067c478bd9Sstevel@tonic-gate st.st_mode, sff);
56077c478bd9Sstevel@tonic-gate if (dst < 0)
56087c478bd9Sstevel@tonic-gate goto fail;
56097c478bd9Sstevel@tonic-gate
56107c478bd9Sstevel@tonic-gate /* Copy all of the bytes one buffer at a time */
56117c478bd9Sstevel@tonic-gate while ((readlen = read(src, &buf, sizeof(buf))) > 0)
56127c478bd9Sstevel@tonic-gate {
56137c478bd9Sstevel@tonic-gate ssize_t left = readlen;
56147c478bd9Sstevel@tonic-gate char *p = buf;
56157c478bd9Sstevel@tonic-gate
56167c478bd9Sstevel@tonic-gate while (left > 0 &&
56177c478bd9Sstevel@tonic-gate (writelen = write(dst, p, (size_t) left)) >= 0)
56187c478bd9Sstevel@tonic-gate {
56197c478bd9Sstevel@tonic-gate left -= writelen;
56207c478bd9Sstevel@tonic-gate p += writelen;
56217c478bd9Sstevel@tonic-gate }
56227c478bd9Sstevel@tonic-gate if (writelen < 0)
56237c478bd9Sstevel@tonic-gate break;
56247c478bd9Sstevel@tonic-gate }
56257c478bd9Sstevel@tonic-gate
56267c478bd9Sstevel@tonic-gate /* Any trouble reading? */
56277c478bd9Sstevel@tonic-gate if (readlen < 0 || writelen < 0)
56287c478bd9Sstevel@tonic-gate goto fail;
56297c478bd9Sstevel@tonic-gate
56307c478bd9Sstevel@tonic-gate /* Close the input file */
56317c478bd9Sstevel@tonic-gate if (close(src) < 0)
56327c478bd9Sstevel@tonic-gate {
56337c478bd9Sstevel@tonic-gate src = -1;
56347c478bd9Sstevel@tonic-gate goto fail;
56357c478bd9Sstevel@tonic-gate }
56367c478bd9Sstevel@tonic-gate src = -1;
56377c478bd9Sstevel@tonic-gate
56387c478bd9Sstevel@tonic-gate /* Close the output file */
56397c478bd9Sstevel@tonic-gate if (close(dst) < 0)
56407c478bd9Sstevel@tonic-gate {
56417c478bd9Sstevel@tonic-gate /* don't set dst = -1 here so we unlink the file */
56427c478bd9Sstevel@tonic-gate goto fail;
56437c478bd9Sstevel@tonic-gate }
56447c478bd9Sstevel@tonic-gate
56457c478bd9Sstevel@tonic-gate /* Success */
56467c478bd9Sstevel@tonic-gate return 0;
56477c478bd9Sstevel@tonic-gate
56487c478bd9Sstevel@tonic-gate fail:
56497c478bd9Sstevel@tonic-gate save_errno = errno;
56507c478bd9Sstevel@tonic-gate if (src >= 0)
56517c478bd9Sstevel@tonic-gate (void) close(src);
56527c478bd9Sstevel@tonic-gate if (dst >= 0)
56537c478bd9Sstevel@tonic-gate {
56547c478bd9Sstevel@tonic-gate (void) unlink(target);
56557c478bd9Sstevel@tonic-gate (void) close(dst);
56567c478bd9Sstevel@tonic-gate }
56577c478bd9Sstevel@tonic-gate errno = save_errno;
56587c478bd9Sstevel@tonic-gate return -1;
56597c478bd9Sstevel@tonic-gate }
56607c478bd9Sstevel@tonic-gate #endif /* NEEDLINK */
56617c478bd9Sstevel@tonic-gate
56627c478bd9Sstevel@tonic-gate /*
56637c478bd9Sstevel@tonic-gate ** Compile-Time options
56647c478bd9Sstevel@tonic-gate */
56657c478bd9Sstevel@tonic-gate
56667c478bd9Sstevel@tonic-gate char *CompileOptions[] =
56677c478bd9Sstevel@tonic-gate {
56687c478bd9Sstevel@tonic-gate #if ALLOW_255
56697c478bd9Sstevel@tonic-gate "ALLOW_255",
56707c478bd9Sstevel@tonic-gate #endif /* ALLOW_255 */
56717c478bd9Sstevel@tonic-gate #if NAMED_BIND
56727c478bd9Sstevel@tonic-gate # if DNSMAP
56737c478bd9Sstevel@tonic-gate "DNSMAP",
56747c478bd9Sstevel@tonic-gate # endif /* DNSMAP */
56757c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
56767c478bd9Sstevel@tonic-gate #if EGD
56777c478bd9Sstevel@tonic-gate "EGD",
56787c478bd9Sstevel@tonic-gate #endif /* EGD */
56797c478bd9Sstevel@tonic-gate #if HESIOD
56807c478bd9Sstevel@tonic-gate "HESIOD",
56817c478bd9Sstevel@tonic-gate #endif /* HESIOD */
56827c478bd9Sstevel@tonic-gate #if HES_GETMAILHOST
56837c478bd9Sstevel@tonic-gate "HES_GETMAILHOST",
56847c478bd9Sstevel@tonic-gate #endif /* HES_GETMAILHOST */
56857c478bd9Sstevel@tonic-gate #if LDAPMAP
56867c478bd9Sstevel@tonic-gate "LDAPMAP",
56877c478bd9Sstevel@tonic-gate #endif /* LDAPMAP */
568849218d4fSjbeck #if LDAP_REFERRALS
568949218d4fSjbeck "LDAP_REFERRALS",
569049218d4fSjbeck #endif /* LDAP_REFERRALS */
56917c478bd9Sstevel@tonic-gate #if LOG
56927c478bd9Sstevel@tonic-gate "LOG",
56937c478bd9Sstevel@tonic-gate #endif /* LOG */
56947c478bd9Sstevel@tonic-gate #if MAP_NSD
56957c478bd9Sstevel@tonic-gate "MAP_NSD",
56967c478bd9Sstevel@tonic-gate #endif /* MAP_NSD */
56977c478bd9Sstevel@tonic-gate #if MAP_REGEX
56987c478bd9Sstevel@tonic-gate "MAP_REGEX",
56997c478bd9Sstevel@tonic-gate #endif /* MAP_REGEX */
57007c478bd9Sstevel@tonic-gate #if MATCHGECOS
57017c478bd9Sstevel@tonic-gate "MATCHGECOS",
57027c478bd9Sstevel@tonic-gate #endif /* MATCHGECOS */
57037c478bd9Sstevel@tonic-gate #if MILTER
57047c478bd9Sstevel@tonic-gate "MILTER",
57057c478bd9Sstevel@tonic-gate #endif /* MILTER */
57067c478bd9Sstevel@tonic-gate #if MIME7TO8
57077c478bd9Sstevel@tonic-gate "MIME7TO8",
57087c478bd9Sstevel@tonic-gate #endif /* MIME7TO8 */
57097c478bd9Sstevel@tonic-gate #if MIME7TO8_OLD
57107c478bd9Sstevel@tonic-gate "MIME7TO8_OLD",
57117c478bd9Sstevel@tonic-gate #endif /* MIME7TO8_OLD */
57127c478bd9Sstevel@tonic-gate #if MIME8TO7
57137c478bd9Sstevel@tonic-gate "MIME8TO7",
57147c478bd9Sstevel@tonic-gate #endif /* MIME8TO7 */
57157c478bd9Sstevel@tonic-gate #if NAMED_BIND
57167c478bd9Sstevel@tonic-gate "NAMED_BIND",
57177c478bd9Sstevel@tonic-gate #endif /* NAMED_BIND */
57187c478bd9Sstevel@tonic-gate #if NDBM
57197c478bd9Sstevel@tonic-gate "NDBM",
57207c478bd9Sstevel@tonic-gate #endif /* NDBM */
57217c478bd9Sstevel@tonic-gate #if NETINET
57227c478bd9Sstevel@tonic-gate "NETINET",
57237c478bd9Sstevel@tonic-gate #endif /* NETINET */
57247c478bd9Sstevel@tonic-gate #if NETINET6
57257c478bd9Sstevel@tonic-gate "NETINET6",
57267c478bd9Sstevel@tonic-gate #endif /* NETINET6 */
57277c478bd9Sstevel@tonic-gate #if NETINFO
57287c478bd9Sstevel@tonic-gate "NETINFO",
57297c478bd9Sstevel@tonic-gate #endif /* NETINFO */
57307c478bd9Sstevel@tonic-gate #if NETISO
57317c478bd9Sstevel@tonic-gate "NETISO",
57327c478bd9Sstevel@tonic-gate #endif /* NETISO */
57337c478bd9Sstevel@tonic-gate #if NETNS
57347c478bd9Sstevel@tonic-gate "NETNS",
57357c478bd9Sstevel@tonic-gate #endif /* NETNS */
57367c478bd9Sstevel@tonic-gate #if NETUNIX
57377c478bd9Sstevel@tonic-gate "NETUNIX",
57387c478bd9Sstevel@tonic-gate #endif /* NETUNIX */
57397c478bd9Sstevel@tonic-gate #if NETX25
57407c478bd9Sstevel@tonic-gate "NETX25",
57417c478bd9Sstevel@tonic-gate #endif /* NETX25 */
57427c478bd9Sstevel@tonic-gate #if NEWDB
57437c478bd9Sstevel@tonic-gate "NEWDB",
57447c478bd9Sstevel@tonic-gate #endif /* NEWDB */
57457c478bd9Sstevel@tonic-gate #if NIS
57467c478bd9Sstevel@tonic-gate "NIS",
57477c478bd9Sstevel@tonic-gate #endif /* NIS */
57487c478bd9Sstevel@tonic-gate #if NISPLUS
57497c478bd9Sstevel@tonic-gate "NISPLUS",
57507c478bd9Sstevel@tonic-gate #endif /* NISPLUS */
57517c478bd9Sstevel@tonic-gate #if NO_DH
57527c478bd9Sstevel@tonic-gate "NO_DH",
57537c478bd9Sstevel@tonic-gate #endif /* NO_DH */
57547c478bd9Sstevel@tonic-gate #if PH_MAP
57557c478bd9Sstevel@tonic-gate "PH_MAP",
57567c478bd9Sstevel@tonic-gate #endif /* PH_MAP */
57577c478bd9Sstevel@tonic-gate #ifdef PICKY_HELO_CHECK
57587c478bd9Sstevel@tonic-gate "PICKY_HELO_CHECK",
57597c478bd9Sstevel@tonic-gate #endif /* PICKY_HELO_CHECK */
57607c478bd9Sstevel@tonic-gate #if PIPELINING
57617c478bd9Sstevel@tonic-gate "PIPELINING",
57627c478bd9Sstevel@tonic-gate #endif /* PIPELINING */
57637c478bd9Sstevel@tonic-gate #if SASL
57647c478bd9Sstevel@tonic-gate # if SASL >= 20000
57657c478bd9Sstevel@tonic-gate "SASLv2",
57667c478bd9Sstevel@tonic-gate # else /* SASL >= 20000 */
57677c478bd9Sstevel@tonic-gate "SASL",
57687c478bd9Sstevel@tonic-gate # endif /* SASL >= 20000 */
57697c478bd9Sstevel@tonic-gate #endif /* SASL */
57707c478bd9Sstevel@tonic-gate #if SCANF
57717c478bd9Sstevel@tonic-gate "SCANF",
57727c478bd9Sstevel@tonic-gate #endif /* SCANF */
5773058561cbSjbeck #if SM_LDAP_ERROR_ON_MISSING_ARGS
5774058561cbSjbeck "SM_LDAP_ERROR_ON_MISSING_ARGS",
5775058561cbSjbeck #endif /* SM_LDAP_ERROR_ON_MISSING_ARGS */
57767c478bd9Sstevel@tonic-gate #if SMTPDEBUG
57777c478bd9Sstevel@tonic-gate "SMTPDEBUG",
57787c478bd9Sstevel@tonic-gate #endif /* SMTPDEBUG */
57797c478bd9Sstevel@tonic-gate #if SOCKETMAP
57807c478bd9Sstevel@tonic-gate "SOCKETMAP",
57817c478bd9Sstevel@tonic-gate #endif /* SOCKETMAP */
57827c478bd9Sstevel@tonic-gate #if STARTTLS
57837c478bd9Sstevel@tonic-gate "STARTTLS",
57847c478bd9Sstevel@tonic-gate #endif /* STARTTLS */
57857c478bd9Sstevel@tonic-gate #if SUID_ROOT_FILES_OK
57867c478bd9Sstevel@tonic-gate "SUID_ROOT_FILES_OK",
57877c478bd9Sstevel@tonic-gate #endif /* SUID_ROOT_FILES_OK */
57887c478bd9Sstevel@tonic-gate #if TCPWRAPPERS
57897c478bd9Sstevel@tonic-gate "TCPWRAPPERS",
57907c478bd9Sstevel@tonic-gate #endif /* TCPWRAPPERS */
57917c478bd9Sstevel@tonic-gate #if TLS_NO_RSA
57927c478bd9Sstevel@tonic-gate "TLS_NO_RSA",
57937c478bd9Sstevel@tonic-gate #endif /* TLS_NO_RSA */
57947c478bd9Sstevel@tonic-gate #if TLS_VRFY_PER_CTX
57957c478bd9Sstevel@tonic-gate "TLS_VRFY_PER_CTX",
57967c478bd9Sstevel@tonic-gate #endif /* TLS_VRFY_PER_CTX */
57977c478bd9Sstevel@tonic-gate #if USERDB
57987c478bd9Sstevel@tonic-gate "USERDB",
57997c478bd9Sstevel@tonic-gate #endif /* USERDB */
58007c478bd9Sstevel@tonic-gate #if USE_LDAP_INIT
58017c478bd9Sstevel@tonic-gate "USE_LDAP_INIT",
58027c478bd9Sstevel@tonic-gate #endif /* USE_LDAP_INIT */
58037c478bd9Sstevel@tonic-gate #if USE_TTYPATH
58047c478bd9Sstevel@tonic-gate "USE_TTYPATH",
58057c478bd9Sstevel@tonic-gate #endif /* USE_TTYPATH */
58067c478bd9Sstevel@tonic-gate #if XDEBUG
58077c478bd9Sstevel@tonic-gate "XDEBUG",
58087c478bd9Sstevel@tonic-gate #endif /* XDEBUG */
58097c478bd9Sstevel@tonic-gate #if XLA
58107c478bd9Sstevel@tonic-gate "XLA",
58117c478bd9Sstevel@tonic-gate #endif /* XLA */
58127c478bd9Sstevel@tonic-gate NULL
58137c478bd9Sstevel@tonic-gate };
58147c478bd9Sstevel@tonic-gate
58157c478bd9Sstevel@tonic-gate
58167c478bd9Sstevel@tonic-gate /*
58177c478bd9Sstevel@tonic-gate ** OS compile options.
58187c478bd9Sstevel@tonic-gate */
58197c478bd9Sstevel@tonic-gate
58207c478bd9Sstevel@tonic-gate char *OsCompileOptions[] =
58217c478bd9Sstevel@tonic-gate {
58227c478bd9Sstevel@tonic-gate #if ADDRCONFIG_IS_BROKEN
58237c478bd9Sstevel@tonic-gate "ADDRCONFIG_IS_BROKEN",
58247c478bd9Sstevel@tonic-gate #endif /* ADDRCONFIG_IS_BROKEN */
58257c478bd9Sstevel@tonic-gate #ifdef AUTO_NETINFO_HOSTS
58267c478bd9Sstevel@tonic-gate "AUTO_NETINFO_HOSTS",
58277c478bd9Sstevel@tonic-gate #endif /* AUTO_NETINFO_HOSTS */
58287c478bd9Sstevel@tonic-gate #ifdef AUTO_NIS_ALIASES
58297c478bd9Sstevel@tonic-gate "AUTO_NIS_ALIASES",
58307c478bd9Sstevel@tonic-gate #endif /* AUTO_NIS_ALIASES */
58317c478bd9Sstevel@tonic-gate #if BROKEN_RES_SEARCH
58327c478bd9Sstevel@tonic-gate "BROKEN_RES_SEARCH",
58337c478bd9Sstevel@tonic-gate #endif /* BROKEN_RES_SEARCH */
58347c478bd9Sstevel@tonic-gate #ifdef BSD4_4_SOCKADDR
58357c478bd9Sstevel@tonic-gate "BSD4_4_SOCKADDR",
58367c478bd9Sstevel@tonic-gate #endif /* BSD4_4_SOCKADDR */
58377c478bd9Sstevel@tonic-gate #if BOGUS_O_EXCL
58387c478bd9Sstevel@tonic-gate "BOGUS_O_EXCL",
58397c478bd9Sstevel@tonic-gate #endif /* BOGUS_O_EXCL */
58407c478bd9Sstevel@tonic-gate #if DEC_OSF_BROKEN_GETPWENT
58417c478bd9Sstevel@tonic-gate "DEC_OSF_BROKEN_GETPWENT",
58427c478bd9Sstevel@tonic-gate #endif /* DEC_OSF_BROKEN_GETPWENT */
58437c478bd9Sstevel@tonic-gate #if FAST_PID_RECYCLE
58447c478bd9Sstevel@tonic-gate "FAST_PID_RECYCLE",
58457c478bd9Sstevel@tonic-gate #endif /* FAST_PID_RECYCLE */
58467c478bd9Sstevel@tonic-gate #if HASCLOSEFROM
58477c478bd9Sstevel@tonic-gate "HASCLOSEFROM",
58487c478bd9Sstevel@tonic-gate #endif /* HASCLOSEFROM */
58497c478bd9Sstevel@tonic-gate #if HASFCHOWN
58507c478bd9Sstevel@tonic-gate "HASFCHOWN",
58517c478bd9Sstevel@tonic-gate #endif /* HASFCHOWN */
58527c478bd9Sstevel@tonic-gate #if HASFCHMOD
58537c478bd9Sstevel@tonic-gate "HASFCHMOD",
58547c478bd9Sstevel@tonic-gate #endif /* HASFCHMOD */
58557c478bd9Sstevel@tonic-gate #if HASFDWALK
58567c478bd9Sstevel@tonic-gate "HASFDWALK",
58577c478bd9Sstevel@tonic-gate #endif /* HASFDWALK */
58587c478bd9Sstevel@tonic-gate #if HASFLOCK
58597c478bd9Sstevel@tonic-gate "HASFLOCK",
58607c478bd9Sstevel@tonic-gate #endif /* HASFLOCK */
58617c478bd9Sstevel@tonic-gate #if HASGETDTABLESIZE
58627c478bd9Sstevel@tonic-gate "HASGETDTABLESIZE",
58637c478bd9Sstevel@tonic-gate #endif /* HASGETDTABLESIZE */
58647c478bd9Sstevel@tonic-gate #if HASGETUSERSHELL
58657c478bd9Sstevel@tonic-gate "HASGETUSERSHELL",
58667c478bd9Sstevel@tonic-gate #endif /* HASGETUSERSHELL */
58677c478bd9Sstevel@tonic-gate #if HASINITGROUPS
58687c478bd9Sstevel@tonic-gate "HASINITGROUPS",
58697c478bd9Sstevel@tonic-gate #endif /* HASINITGROUPS */
58707c478bd9Sstevel@tonic-gate #if HASLDAPGETALIASBYNAME
58717c478bd9Sstevel@tonic-gate "HASLDAPGETALIASBYNAME",
58727c478bd9Sstevel@tonic-gate #endif /* HASLDAPGETALIASBYNAME */
58737c478bd9Sstevel@tonic-gate #if HASLSTAT
58747c478bd9Sstevel@tonic-gate "HASLSTAT",
58757c478bd9Sstevel@tonic-gate #endif /* HASLSTAT */
58767c478bd9Sstevel@tonic-gate #if HASNICE
58777c478bd9Sstevel@tonic-gate "HASNICE",
58787c478bd9Sstevel@tonic-gate #endif /* HASNICE */
58797c478bd9Sstevel@tonic-gate #if HASRANDOM
58807c478bd9Sstevel@tonic-gate "HASRANDOM",
58817c478bd9Sstevel@tonic-gate #endif /* HASRANDOM */
58827c478bd9Sstevel@tonic-gate #if HASRRESVPORT
58837c478bd9Sstevel@tonic-gate "HASRRESVPORT",
58847c478bd9Sstevel@tonic-gate #endif /* HASRRESVPORT */
58857c478bd9Sstevel@tonic-gate #if HASSETEGID
58867c478bd9Sstevel@tonic-gate "HASSETEGID",
58877c478bd9Sstevel@tonic-gate #endif /* HASSETEGID */
58887c478bd9Sstevel@tonic-gate #if HASSETLOGIN
58897c478bd9Sstevel@tonic-gate "HASSETLOGIN",
58907c478bd9Sstevel@tonic-gate #endif /* HASSETLOGIN */
58917c478bd9Sstevel@tonic-gate #if HASSETREGID
58927c478bd9Sstevel@tonic-gate "HASSETREGID",
58937c478bd9Sstevel@tonic-gate #endif /* HASSETREGID */
58947c478bd9Sstevel@tonic-gate #if HASSETRESGID
58957c478bd9Sstevel@tonic-gate "HASSETRESGID",
58967c478bd9Sstevel@tonic-gate #endif /* HASSETRESGID */
58977c478bd9Sstevel@tonic-gate #if HASSETREUID
58987c478bd9Sstevel@tonic-gate "HASSETREUID",
58997c478bd9Sstevel@tonic-gate #endif /* HASSETREUID */
59007c478bd9Sstevel@tonic-gate #if HASSETRLIMIT
59017c478bd9Sstevel@tonic-gate "HASSETRLIMIT",
59027c478bd9Sstevel@tonic-gate #endif /* HASSETRLIMIT */
59037c478bd9Sstevel@tonic-gate #if HASSETSID
59047c478bd9Sstevel@tonic-gate "HASSETSID",
59057c478bd9Sstevel@tonic-gate #endif /* HASSETSID */
59067c478bd9Sstevel@tonic-gate #if HASSETUSERCONTEXT
59077c478bd9Sstevel@tonic-gate "HASSETUSERCONTEXT",
59087c478bd9Sstevel@tonic-gate #endif /* HASSETUSERCONTEXT */
59097c478bd9Sstevel@tonic-gate #if HASSETVBUF
59107c478bd9Sstevel@tonic-gate "HASSETVBUF",
59117c478bd9Sstevel@tonic-gate #endif /* HASSETVBUF */
59127c478bd9Sstevel@tonic-gate #if HAS_ST_GEN
59137c478bd9Sstevel@tonic-gate "HAS_ST_GEN",
59147c478bd9Sstevel@tonic-gate #endif /* HAS_ST_GEN */
59157c478bd9Sstevel@tonic-gate #if HASSRANDOMDEV
59167c478bd9Sstevel@tonic-gate "HASSRANDOMDEV",
59177c478bd9Sstevel@tonic-gate #endif /* HASSRANDOMDEV */
59187c478bd9Sstevel@tonic-gate #if HASURANDOMDEV
59197c478bd9Sstevel@tonic-gate "HASURANDOMDEV",
59207c478bd9Sstevel@tonic-gate #endif /* HASURANDOMDEV */
59217c478bd9Sstevel@tonic-gate #if HASSTRERROR
59227c478bd9Sstevel@tonic-gate "HASSTRERROR",
59237c478bd9Sstevel@tonic-gate #endif /* HASSTRERROR */
59247c478bd9Sstevel@tonic-gate #if HASULIMIT
59257c478bd9Sstevel@tonic-gate "HASULIMIT",
59267c478bd9Sstevel@tonic-gate #endif /* HASULIMIT */
59277c478bd9Sstevel@tonic-gate #if HASUNAME
59287c478bd9Sstevel@tonic-gate "HASUNAME",
59297c478bd9Sstevel@tonic-gate #endif /* HASUNAME */
59307c478bd9Sstevel@tonic-gate #if HASUNSETENV
59317c478bd9Sstevel@tonic-gate "HASUNSETENV",
59327c478bd9Sstevel@tonic-gate #endif /* HASUNSETENV */
59337c478bd9Sstevel@tonic-gate #if HASWAITPID
59347c478bd9Sstevel@tonic-gate "HASWAITPID",
59357c478bd9Sstevel@tonic-gate #endif /* HASWAITPID */
59367c478bd9Sstevel@tonic-gate #if IDENTPROTO
59377c478bd9Sstevel@tonic-gate "IDENTPROTO",
59387c478bd9Sstevel@tonic-gate #endif /* IDENTPROTO */
59397c478bd9Sstevel@tonic-gate #if IP_SRCROUTE
59407c478bd9Sstevel@tonic-gate "IP_SRCROUTE",
59417c478bd9Sstevel@tonic-gate #endif /* IP_SRCROUTE */
59427c478bd9Sstevel@tonic-gate #if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL
59437c478bd9Sstevel@tonic-gate "LOCK_ON_OPEN",
59447c478bd9Sstevel@tonic-gate #endif /* O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL */
5945058561cbSjbeck #if MILTER_NO_NAGLE
5946058561cbSjbeck "MILTER_NO_NAGLE ",
5947058561cbSjbeck #endif /* MILTER_NO_NAGLE */
59487c478bd9Sstevel@tonic-gate #if NEEDFSYNC
59497c478bd9Sstevel@tonic-gate "NEEDFSYNC",
59507c478bd9Sstevel@tonic-gate #endif /* NEEDFSYNC */
59517c478bd9Sstevel@tonic-gate #if NEEDLINK
59527c478bd9Sstevel@tonic-gate "NEEDLINK",
59537c478bd9Sstevel@tonic-gate #endif /* NEEDLINK */
59547c478bd9Sstevel@tonic-gate #if NEEDLOCAL_HOSTNAME_LENGTH
59557c478bd9Sstevel@tonic-gate "NEEDLOCAL_HOSTNAME_LENGTH",
59567c478bd9Sstevel@tonic-gate #endif /* NEEDLOCAL_HOSTNAME_LENGTH */
59577c478bd9Sstevel@tonic-gate #if NEEDSGETIPNODE
59587c478bd9Sstevel@tonic-gate "NEEDSGETIPNODE",
59597c478bd9Sstevel@tonic-gate #endif /* NEEDSGETIPNODE */
59607c478bd9Sstevel@tonic-gate #if NEEDSTRSTR
59617c478bd9Sstevel@tonic-gate "NEEDSTRSTR",
59627c478bd9Sstevel@tonic-gate #endif /* NEEDSTRSTR */
59637c478bd9Sstevel@tonic-gate #if NEEDSTRTOL
59647c478bd9Sstevel@tonic-gate "NEEDSTRTOL",
59657c478bd9Sstevel@tonic-gate #endif /* NEEDSTRTOL */
59667c478bd9Sstevel@tonic-gate #ifdef NO_GETSERVBYNAME
59677c478bd9Sstevel@tonic-gate "NO_GETSERVBYNAME",
59687c478bd9Sstevel@tonic-gate #endif /* NO_GETSERVBYNAME */
59697c478bd9Sstevel@tonic-gate #if NOFTRUNCATE
59707c478bd9Sstevel@tonic-gate "NOFTRUNCATE",
59717c478bd9Sstevel@tonic-gate #endif /* NOFTRUNCATE */
59727c478bd9Sstevel@tonic-gate #if REQUIRES_DIR_FSYNC
59737c478bd9Sstevel@tonic-gate "REQUIRES_DIR_FSYNC",
59747c478bd9Sstevel@tonic-gate #endif /* REQUIRES_DIR_FSYNC */
59757c478bd9Sstevel@tonic-gate #if RLIMIT_NEEDS_SYS_TIME_H
59767c478bd9Sstevel@tonic-gate "RLIMIT_NEEDS_SYS_TIME_H",
59777c478bd9Sstevel@tonic-gate #endif /* RLIMIT_NEEDS_SYS_TIME_H */
59787c478bd9Sstevel@tonic-gate #if SAFENFSPATHCONF
59797c478bd9Sstevel@tonic-gate "SAFENFSPATHCONF",
59807c478bd9Sstevel@tonic-gate #endif /* SAFENFSPATHCONF */
59817c478bd9Sstevel@tonic-gate #if SECUREWARE
59827c478bd9Sstevel@tonic-gate "SECUREWARE",
59837c478bd9Sstevel@tonic-gate #endif /* SECUREWARE */
59847c478bd9Sstevel@tonic-gate #if SHARE_V1
59857c478bd9Sstevel@tonic-gate "SHARE_V1",
59867c478bd9Sstevel@tonic-gate #endif /* SHARE_V1 */
59877c478bd9Sstevel@tonic-gate #if SIOCGIFCONF_IS_BROKEN
59887c478bd9Sstevel@tonic-gate "SIOCGIFCONF_IS_BROKEN",
59897c478bd9Sstevel@tonic-gate #endif /* SIOCGIFCONF_IS_BROKEN */
59907c478bd9Sstevel@tonic-gate #if SIOCGIFNUM_IS_BROKEN
59917c478bd9Sstevel@tonic-gate "SIOCGIFNUM_IS_BROKEN",
59927c478bd9Sstevel@tonic-gate #endif /* SIOCGIFNUM_IS_BROKEN */
59937c478bd9Sstevel@tonic-gate #if SNPRINTF_IS_BROKEN
59947c478bd9Sstevel@tonic-gate "SNPRINTF_IS_BROKEN",
59957c478bd9Sstevel@tonic-gate #endif /* SNPRINTF_IS_BROKEN */
59967c478bd9Sstevel@tonic-gate #if SO_REUSEADDR_IS_BROKEN
59977c478bd9Sstevel@tonic-gate "SO_REUSEADDR_IS_BROKEN",
59987c478bd9Sstevel@tonic-gate #endif /* SO_REUSEADDR_IS_BROKEN */
59997c478bd9Sstevel@tonic-gate #if SYS5SETPGRP
60007c478bd9Sstevel@tonic-gate "SYS5SETPGRP",
60017c478bd9Sstevel@tonic-gate #endif /* SYS5SETPGRP */
60027c478bd9Sstevel@tonic-gate #if SYSTEM5
60037c478bd9Sstevel@tonic-gate "SYSTEM5",
60047c478bd9Sstevel@tonic-gate #endif /* SYSTEM5 */
60057c478bd9Sstevel@tonic-gate #if USE_DOUBLE_FORK
60067c478bd9Sstevel@tonic-gate "USE_DOUBLE_FORK",
60077c478bd9Sstevel@tonic-gate #endif /* USE_DOUBLE_FORK */
60087c478bd9Sstevel@tonic-gate #if USE_ENVIRON
60097c478bd9Sstevel@tonic-gate "USE_ENVIRON",
60107c478bd9Sstevel@tonic-gate #endif /* USE_ENVIRON */
60117c478bd9Sstevel@tonic-gate #if USE_SA_SIGACTION
60127c478bd9Sstevel@tonic-gate "USE_SA_SIGACTION",
60137c478bd9Sstevel@tonic-gate #endif /* USE_SA_SIGACTION */
60147c478bd9Sstevel@tonic-gate #if USE_SIGLONGJMP
60157c478bd9Sstevel@tonic-gate "USE_SIGLONGJMP",
60167c478bd9Sstevel@tonic-gate #endif /* USE_SIGLONGJMP */
60177c478bd9Sstevel@tonic-gate #if USEGETCONFATTR
60187c478bd9Sstevel@tonic-gate "USEGETCONFATTR",
60197c478bd9Sstevel@tonic-gate #endif /* USEGETCONFATTR */
60207c478bd9Sstevel@tonic-gate #if USESETEUID
60217c478bd9Sstevel@tonic-gate "USESETEUID",
60227c478bd9Sstevel@tonic-gate #endif /* USESETEUID */
60237c478bd9Sstevel@tonic-gate #ifdef USESYSCTL
60247c478bd9Sstevel@tonic-gate "USESYSCTL",
60257c478bd9Sstevel@tonic-gate #endif /* USESYSCTL */
60267c478bd9Sstevel@tonic-gate #if USING_NETSCAPE_LDAP
60277c478bd9Sstevel@tonic-gate "USING_NETSCAPE_LDAP",
60287c478bd9Sstevel@tonic-gate #endif /* USING_NETSCAPE_LDAP */
60297c478bd9Sstevel@tonic-gate #ifdef WAITUNION
60307c478bd9Sstevel@tonic-gate "WAITUNION",
60317c478bd9Sstevel@tonic-gate #endif /* WAITUNION */
60327c478bd9Sstevel@tonic-gate NULL
60337c478bd9Sstevel@tonic-gate };
60347c478bd9Sstevel@tonic-gate
60357c478bd9Sstevel@tonic-gate /*
60367c478bd9Sstevel@tonic-gate ** FFR compile options.
60377c478bd9Sstevel@tonic-gate */
60387c478bd9Sstevel@tonic-gate
60397c478bd9Sstevel@tonic-gate char *FFRCompileOptions[] =
60407c478bd9Sstevel@tonic-gate {
60417800901eSjbeck #if _FFR_ADDR_TYPE_MODES
60427800901eSjbeck /* more info in {addr_type}, requires m4 changes! */
60437800901eSjbeck "_FFR_ADDR_TYPE_MODES",
60447800901eSjbeck #endif /* _FFR_ADDR_TYPE_MODES */
60457c478bd9Sstevel@tonic-gate #if _FFR_ALLOW_SASLINFO
60467c478bd9Sstevel@tonic-gate /* DefaultAuthInfo can be specified by user. */
60477c478bd9Sstevel@tonic-gate /* DefaultAuthInfo doesn't really work in 8.13 anymore. */
60487c478bd9Sstevel@tonic-gate "_FFR_ALLOW_SASLINFO",
60497c478bd9Sstevel@tonic-gate #endif /* _FFR_ALLOW_SASLINFO */
6050d4660949Sjbeck #if _FFR_BADRCPT_SHUTDOWN
6051d4660949Sjbeck /* shut down connection (421) if there are too many bad RCPTs */
6052d4660949Sjbeck "_FFR_BADRCPT_SHUTDOWN",
6053d4660949Sjbeck #endif /* _FFR_BADRCPT_SHUTDOWN */
60547c478bd9Sstevel@tonic-gate #if _FFR_BESTMX_BETTER_TRUNCATION
60557c478bd9Sstevel@tonic-gate /* Better truncation of list of MX records for dns map. */
60567c478bd9Sstevel@tonic-gate "_FFR_BESTMX_BETTER_TRUNCATION",
60577c478bd9Sstevel@tonic-gate #endif /* _FFR_BESTMX_BETTER_TRUNCATION */
60587c478bd9Sstevel@tonic-gate #if _FFR_CATCH_BROKEN_MTAS
60597c478bd9Sstevel@tonic-gate /* Deal with MTAs that send a reply during the DATA phase. */
60607c478bd9Sstevel@tonic-gate "_FFR_CATCH_BROKEN_MTAS",
60617c478bd9Sstevel@tonic-gate #endif /* _FFR_CATCH_BROKEN_MTAS */
6062*e9af4bc0SJohn Beck #if _FFR_CHECKCONFIG
6063*e9af4bc0SJohn Beck /* New OpMode to check the configuration file */
6064*e9af4bc0SJohn Beck "_FFR_CHECKCONFIG",
6065*e9af4bc0SJohn Beck #endif /* _FFR_CHECKCONFIG */
60667c478bd9Sstevel@tonic-gate #if _FFR_CHK_QUEUE
60677c478bd9Sstevel@tonic-gate /* Stricter checks about queue directory permissions. */
60687c478bd9Sstevel@tonic-gate "_FFR_CHK_QUEUE",
60697c478bd9Sstevel@tonic-gate #endif /* _FFR_CHK_QUEUE */
60707c478bd9Sstevel@tonic-gate #if _FFR_CLIENT_SIZE
60717c478bd9Sstevel@tonic-gate /* Don't try to send mail if its size exceeds SIZE= of server. */
60727c478bd9Sstevel@tonic-gate "_FFR_CLIENT_SIZE",
60737c478bd9Sstevel@tonic-gate #endif /* _FFR_CLIENT_SIZE */
60747c478bd9Sstevel@tonic-gate #if _FFR_CRLPATH
60757c478bd9Sstevel@tonic-gate /* CRLPath; needs documentation; Al Smith */
60767c478bd9Sstevel@tonic-gate "_FFR_CRLPATH",
60777c478bd9Sstevel@tonic-gate #endif /* _FFR_CRLPATH */
60787c478bd9Sstevel@tonic-gate #if _FFR_DAEMON_NETUNIX
60797c478bd9Sstevel@tonic-gate /* Allow local (not just TCP) socket connection to server. */
60807c478bd9Sstevel@tonic-gate "_FFR_DAEMON_NETUNIX",
60817c478bd9Sstevel@tonic-gate #endif /* _FFR_DAEMON_NETUNIX */
60827c478bd9Sstevel@tonic-gate #if _FFR_DEPRECATE_MAILER_FLAG_I
60837c478bd9Sstevel@tonic-gate /* What it says :-) */
60847c478bd9Sstevel@tonic-gate "_FFR_DEPRECATE_MAILER_FLAG_I",
60857c478bd9Sstevel@tonic-gate #endif /* _FFR_DEPRECATE_MAILER_FLAG_I */
6086445f2479Sjbeck #if _FFR_DM_ONE
6087445f2479Sjbeck /* deliver first TA in background, then queue */
6088445f2479Sjbeck "_FFR_DM_ONE",
6089445f2479Sjbeck #endif /* _FFR_DM_ONE */
60907c478bd9Sstevel@tonic-gate #if _FFR_DIGUNIX_SAFECHOWN
60917c478bd9Sstevel@tonic-gate /* Properly set SAFECHOWN (include/sm/conf.h) for Digital UNIX */
60927c478bd9Sstevel@tonic-gate /* Problem noted by Anne Bennett of Concordia University */
60937c478bd9Sstevel@tonic-gate "_FFR_DIGUNIX_SAFECHOWN",
60947c478bd9Sstevel@tonic-gate #endif /* _FFR_DIGUNIX_SAFECHOWN */
60957c478bd9Sstevel@tonic-gate #if _FFR_DNSMAP_ALIASABLE
60967c478bd9Sstevel@tonic-gate /* Allow dns map type to be used for aliases. */
60977c478bd9Sstevel@tonic-gate /* Don Lewis of TDK */
60987c478bd9Sstevel@tonic-gate "_FFR_DNSMAP_ALIASABLE",
60997c478bd9Sstevel@tonic-gate #endif /* _FFR_DNSMAP_ALIASABLE */
61007c478bd9Sstevel@tonic-gate #if _FFR_DONTLOCKFILESFORREAD_OPTION
61017c478bd9Sstevel@tonic-gate /* Enable DontLockFilesForRead option. */
61027c478bd9Sstevel@tonic-gate "_FFR_DONTLOCKFILESFORREAD_OPTION",
61037c478bd9Sstevel@tonic-gate #endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */
61047c478bd9Sstevel@tonic-gate #if _FFR_DOTTED_USERNAMES
61057c478bd9Sstevel@tonic-gate /* Allow usernames with '.' */
61067c478bd9Sstevel@tonic-gate "_FFR_DOTTED_USERNAMES",
61077c478bd9Sstevel@tonic-gate #endif /* _FFR_DOTTED_USERNAMES */
61084aac33d3Sjbeck #if _FFR_DPO_CS
61094aac33d3Sjbeck /*
61104aac33d3Sjbeck ** Make DaemonPortOptions case sensitive.
61114aac33d3Sjbeck ** For some unknown reasons the code converted every option
61124aac33d3Sjbeck ** to uppercase (first letter only, as that's the only one that
61134aac33d3Sjbeck ** is actually checked). This prevented all new lower case options
61144aac33d3Sjbeck ** from working...
61154aac33d3Sjbeck ** The documentation doesn't say anything about case (in)sensitivity,
61164aac33d3Sjbeck ** which means it should be case sensitive by default,
61174aac33d3Sjbeck ** but it's not a good idea to change this within a patch release,
61184aac33d3Sjbeck ** so let's delay this to 8.15.
61194aac33d3Sjbeck */
61204aac33d3Sjbeck
61214aac33d3Sjbeck "_FFR_DPO_CS",
61224aac33d3Sjbeck #endif /* _FFR_DPO_CS */
61237800901eSjbeck #if _FFR_DPRINTF_MAP
61247800901eSjbeck /* dprintf map for logging */
61257800901eSjbeck "_FFR_DPRINTF_MAP",
61267800901eSjbeck #endif /* _FFR_DPRINTF_MAP */
61277c478bd9Sstevel@tonic-gate #if _FFR_DROP_TRUSTUSER_WARNING
61287c478bd9Sstevel@tonic-gate /*
61297c478bd9Sstevel@tonic-gate ** Don't issue this warning:
61307c478bd9Sstevel@tonic-gate ** "readcf: option TrustedUser may cause problems on systems
61317c478bd9Sstevel@tonic-gate ** which do not support fchown() if UseMSP is not set.
61327c478bd9Sstevel@tonic-gate */
61337c478bd9Sstevel@tonic-gate
61347c478bd9Sstevel@tonic-gate "_FFR_DROP_TRUSTUSER_WARNING",
61357c478bd9Sstevel@tonic-gate #endif /* _FFR_DROP_TRUSTUSER_WARNING */
6136058561cbSjbeck #if _FFR_EIGHT_BIT_ADDR_OK
6137058561cbSjbeck /* EightBitAddrOK: allow 8-bit e-mail addresses */
6138058561cbSjbeck "_FFR_EIGHT_BIT_ADDR_OK",
6139058561cbSjbeck #endif /* _FFR_EIGHT_BIT_ADDR_OK */
6140*e9af4bc0SJohn Beck #if _FFR_EXPDELAY
6141*e9af4bc0SJohn Beck /* exponential queue delay */
6142*e9af4bc0SJohn Beck "_FFR_EXPDELAY",
6143*e9af4bc0SJohn Beck #endif /* _FFR_EXPDELAY */
61447c478bd9Sstevel@tonic-gate #if _FFR_EXTRA_MAP_CHECK
61457c478bd9Sstevel@tonic-gate /* perform extra checks on $( $) in R lines */
61467c478bd9Sstevel@tonic-gate "_FFR_EXTRA_MAP_CHECK",
61477c478bd9Sstevel@tonic-gate #endif /* _FFR_EXTRA_MAP_CHECK */
6148058561cbSjbeck #if _FFR_GETHBN_ExFILE
6149058561cbSjbeck /*
6150058561cbSjbeck ** According to Motonori Nakamura some gethostbyname()
6151058561cbSjbeck ** implementations (TurboLinux?) may (temporarily) fail
6152058561cbSjbeck ** due to a lack of file discriptors. Enabling this FFR
6153058561cbSjbeck ** will check errno for EMFILE and ENFILE and in case of a match
6154058561cbSjbeck ** cause a temporary error instead of a permanent error.
6155058561cbSjbeck ** The right solution is of course to file a bug against those
6156058561cbSjbeck ** systems such that they actually set h_errno = TRY_AGAIN.
6157058561cbSjbeck */
6158058561cbSjbeck
6159058561cbSjbeck "_FFR_GETHBN_ExFILE",
6160058561cbSjbeck #endif /* _FFR_GETHBN_ExFILE */
61617c478bd9Sstevel@tonic-gate #if _FFR_FIX_DASHT
61627c478bd9Sstevel@tonic-gate /*
61637c478bd9Sstevel@tonic-gate ** If using -t, force not sending to argv recipients, even
61647c478bd9Sstevel@tonic-gate ** if they are mentioned in the headers.
61657c478bd9Sstevel@tonic-gate */
61667c478bd9Sstevel@tonic-gate
61677c478bd9Sstevel@tonic-gate "_FFR_FIX_DASHT",
61687c478bd9Sstevel@tonic-gate #endif /* _FFR_FIX_DASHT */
61697c478bd9Sstevel@tonic-gate #if _FFR_FORWARD_SYSERR
61707c478bd9Sstevel@tonic-gate /* Cause a "syserr" if forward file isn't "safe". */
61717c478bd9Sstevel@tonic-gate "_FFR_FORWARD_SYSERR",
61727c478bd9Sstevel@tonic-gate #endif /* _FFR_FORWARD_SYSERR */
61737c478bd9Sstevel@tonic-gate #if _FFR_GEN_ORCPT
61747c478bd9Sstevel@tonic-gate /* Generate a ORCPT DSN arg if not already provided */
61757c478bd9Sstevel@tonic-gate "_FFR_GEN_ORCPT",
61767c478bd9Sstevel@tonic-gate #endif /* _FFR_GEN_ORCPT */
61777c478bd9Sstevel@tonic-gate #if _FFR_GROUPREADABLEAUTHINFOFILE
61787c478bd9Sstevel@tonic-gate /* Allow group readable DefaultAuthInfo file. */
61797c478bd9Sstevel@tonic-gate "_FFR_GROUPREADABLEAUTHINFOFILE",
61807c478bd9Sstevel@tonic-gate #endif /* _FFR_GROUPREADABLEAUTHINFOFILE */
61817c478bd9Sstevel@tonic-gate #if _FFR_HANDLE_ISO8859_GECOS
61827c478bd9Sstevel@tonic-gate /*
61837c478bd9Sstevel@tonic-gate ** Allow ISO 8859 characters in GECOS field: replace them
61847c478bd9Sstevel@tonic-gate ** ith ASCII "equivalent".
61857c478bd9Sstevel@tonic-gate */
61867c478bd9Sstevel@tonic-gate
61877c478bd9Sstevel@tonic-gate /* Peter Eriksson of Linkopings universitet */
61887c478bd9Sstevel@tonic-gate "_FFR_HANDLE_ISO8859_GECOS",
61897c478bd9Sstevel@tonic-gate #endif /* _FFR_HANDLE_ISO8859_GECOS */
61907c478bd9Sstevel@tonic-gate #if _FFR_HPUX_NSSWITCH
61917c478bd9Sstevel@tonic-gate /* Use nsswitch on HP-UX */
61927c478bd9Sstevel@tonic-gate "_FFR_HPUX_NSSWITCH",
61937c478bd9Sstevel@tonic-gate #endif /* _FFR_HPUX_NSSWITCH */
61947c478bd9Sstevel@tonic-gate #if _FFR_IGNORE_BOGUS_ADDR
61957c478bd9Sstevel@tonic-gate /* Ignore addresses for which prescan() failed */
61967c478bd9Sstevel@tonic-gate "_FFR_IGNORE_BOGUS_ADDR",
61977c478bd9Sstevel@tonic-gate #endif /* _FFR_IGNORE_BOGUS_ADDR */
61987c478bd9Sstevel@tonic-gate #if _FFR_IGNORE_EXT_ON_HELO
61997c478bd9Sstevel@tonic-gate /* Ignore extensions offered in response to HELO */
62007c478bd9Sstevel@tonic-gate "_FFR_IGNORE_EXT_ON_HELO",
62017c478bd9Sstevel@tonic-gate #endif /* _FFR_IGNORE_EXT_ON_HELO */
6202*e9af4bc0SJohn Beck #if _FFR_LINUX_MHNL
6203*e9af4bc0SJohn Beck /* Set MAXHOSTNAMELEN to 256 (Linux) */
6204*e9af4bc0SJohn Beck "_FFR_LINUX_MHNL",
6205*e9af4bc0SJohn Beck #endif /* _FFR_LINUX_MHNL */
6206d4660949Sjbeck #if _FFR_LOCAL_DAEMON
6207d4660949Sjbeck /* Local daemon mode (-bl) which only accepts loopback connections */
6208d4660949Sjbeck "_FFR_LOCAL_DAEMON",
6209d4660949Sjbeck #endif /* _FFR_LOCAL_DAEMON */
6210*e9af4bc0SJohn Beck #if _FFR_MAIL_MACRO
6211*e9af4bc0SJohn Beck "_FFR_MAIL_MACRO",
6212*e9af4bc0SJohn Beck #endif /* _FFR_MAIL_MACRO */
62137c478bd9Sstevel@tonic-gate #if _FFR_MAXDATASIZE
62147c478bd9Sstevel@tonic-gate /*
62157c478bd9Sstevel@tonic-gate ** It is possible that a header is larger than MILTER_CHUNK_SIZE,
62167c478bd9Sstevel@tonic-gate ** hence this shouldn't be used as limit for milter communication.
62177c478bd9Sstevel@tonic-gate ** see also libmilter/comm.c
62187c478bd9Sstevel@tonic-gate ** Gurusamy Sarathy of ActiveState
62197c478bd9Sstevel@tonic-gate */
62207c478bd9Sstevel@tonic-gate
62217c478bd9Sstevel@tonic-gate "_FFR_MAXDATASIZE",
62227c478bd9Sstevel@tonic-gate #endif /* _FFR_MAXDATASIZE */
62237c478bd9Sstevel@tonic-gate #if _FFR_MAX_FORWARD_ENTRIES
62247c478bd9Sstevel@tonic-gate /* Try to limit number of .forward entries */
62257c478bd9Sstevel@tonic-gate /* (doesn't work) */
62267c478bd9Sstevel@tonic-gate /* Randall S. Winchester of the University of Maryland */
62277c478bd9Sstevel@tonic-gate "_FFR_MAX_FORWARD_ENTRIES",
62287c478bd9Sstevel@tonic-gate #endif /* _FFR_MAX_FORWARD_ENTRIES */
62297c478bd9Sstevel@tonic-gate #if _FFR_MAX_SLEEP_TIME
62307c478bd9Sstevel@tonic-gate /* Limit sleep(2) time in libsm/clock.c */
62317c478bd9Sstevel@tonic-gate "_FFR_MAX_SLEEP_TIME",
62327c478bd9Sstevel@tonic-gate #endif /* _FFR_MAX_SLEEP_TIME */
6233*e9af4bc0SJohn Beck #if _FFR_MDS_NEGOTIATE
6234*e9af4bc0SJohn Beck /* MaxDataSize negotation with libmilter */
6235*e9af4bc0SJohn Beck "_FFR_MDS_NEGOTIATE",
6236*e9af4bc0SJohn Beck #endif /* _FFR_MDS_NEGOTIATE */
6237445f2479Sjbeck #if _FFR_MEMSTAT
6238445f2479Sjbeck /* Check free memory */
6239445f2479Sjbeck "_FFR_MEMSTAT",
6240445f2479Sjbeck #endif /* _FFR_MEMSTAT */
62414aac33d3Sjbeck #if _FFR_MILTER_CHECK
62424aac33d3Sjbeck "_FFR_MILTER_CHECK",
62434aac33d3Sjbeck #endif /* _FFR_MILTER_CHECK */
6244058561cbSjbeck #if _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF
6245058561cbSjbeck /*
6246058561cbSjbeck ** milter_body() uses the same conversion algorithm as putbody()
6247058561cbSjbeck ** to translate the "local" df format (\n) to SMTP format (\r\n).
6248058561cbSjbeck ** However, putbody() and mime8to7() use different conversion
6249058561cbSjbeck ** algorithms.
6250058561cbSjbeck ** If the input date does not follow the SMTP standard
6251058561cbSjbeck ** (e.g., if it has "naked \r"s), then the output from putbody()
6252058561cbSjbeck ** and mime8to7() will most likely be different.
6253058561cbSjbeck ** By turning on this FFR milter_body() will try to "imitate"
6254058561cbSjbeck ** mime8to7().
6255058561cbSjbeck ** Note: there is no (simple) way to deal with both conversions
6256058561cbSjbeck ** in a consistent manner. Moreover, as the "GiGo" principle applies,
6257058561cbSjbeck ** it's not really worth to fix it.
6258058561cbSjbeck */
6259058561cbSjbeck
6260058561cbSjbeck "_FFR_MILTER_CONVERT_ALL_LF_TO_CRLF",
6261058561cbSjbeck #endif /* _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF */
62624aac33d3Sjbeck #if _FFR_MILTER_CHECK_REJECTIONS_TOO
62634aac33d3Sjbeck /*
62644aac33d3Sjbeck ** Also send RCPTs that are rejected by check_rcpt to a milter
62654aac33d3Sjbeck ** (if requested during option negotiation).
62664aac33d3Sjbeck */
62674aac33d3Sjbeck
62684aac33d3Sjbeck "_FFR_MILTER_CHECK_REJECTIONS_TOO",
62694aac33d3Sjbeck #endif /* _FFR_MILTER_CHECK_REJECTIONS_TOO */
6270*e9af4bc0SJohn Beck #if _FFR_MILTER_ENHSC
6271*e9af4bc0SJohn Beck /* extract enhanced status code from milter replies for dsn= logging */
6272*e9af4bc0SJohn Beck "_FFR_MILTER_ENHSC",
6273*e9af4bc0SJohn Beck #endif /* _FFR_MILTER_ENHSC */
62747c478bd9Sstevel@tonic-gate #if _FFR_MIME7TO8_OLD
62757c478bd9Sstevel@tonic-gate /* Old mime7to8 code, the new is broken for at least one example. */
62767c478bd9Sstevel@tonic-gate "_FFR_MIME7TO8_OLD",
62777c478bd9Sstevel@tonic-gate #endif /* _FFR_MAX_SLEEP_TIME */
62787800901eSjbeck #if _FFR_MORE_MACROS
62797800901eSjbeck /* allow more long macro names ("unprintable" characters). */
62807800901eSjbeck "_FFR_MORE_MACROS",
62817800901eSjbeck #endif /* _FFR_MORE_MACROS */
6282445f2479Sjbeck #if _FFR_MSG_ACCEPT
6283445f2479Sjbeck /* allow to override "Message accepted for delivery" */
6284445f2479Sjbeck "_FFR_MSG_ACCEPT",
6285445f2479Sjbeck #endif /* _FFR_MSG_ACCEPT */
62867c478bd9Sstevel@tonic-gate #if _FFR_NODELAYDSN_ON_HOLD
62877c478bd9Sstevel@tonic-gate /* Do not issue a DELAY DSN for mailers that use the hold flag. */
62887c478bd9Sstevel@tonic-gate /* Steven Pitzl */
62897c478bd9Sstevel@tonic-gate "_FFR_NODELAYDSN_ON_HOLD",
62907c478bd9Sstevel@tonic-gate #endif /* _FFR_NODELAYDSN_ON_HOLD */
62917c478bd9Sstevel@tonic-gate #if _FFR_NO_PIPE
62927c478bd9Sstevel@tonic-gate /* Disable PIPELINING, delay client if used. */
62937c478bd9Sstevel@tonic-gate "_FFR_NO_PIPE",
62947c478bd9Sstevel@tonic-gate #endif /* _FFR_NO_PIPE */
62957800901eSjbeck #if _FFR_LDAP_NETWORK_TIMEOUT
62967800901eSjbeck /* set LDAP_OPT_NETWORK_TIMEOUT if available (-c) */
62977800901eSjbeck "_FFR_LDAP_NETWORK_TIMEOUT",
62987800901eSjbeck #endif /* _FFR_LDAP_NETWORK_TIMEOUT */
62997c478bd9Sstevel@tonic-gate #if _FFR_LOG_NTRIES
63007c478bd9Sstevel@tonic-gate /* log ntries=, from Nik Clayton of FreeBSD */
63017c478bd9Sstevel@tonic-gate "_FFR_LOG_NTRIES",
63027c478bd9Sstevel@tonic-gate #endif /* _FFR_LOG_NTRIES */
63034aac33d3Sjbeck #if _FFR_QF_PARANOIA
63044aac33d3Sjbeck "_FFR_QF_PARANOIA",
63054aac33d3Sjbeck #endif /* _FFR_QF_PARANOIA */
63067c478bd9Sstevel@tonic-gate #if _FFR_QUEUEDELAY
63077c478bd9Sstevel@tonic-gate /* Exponential queue delay; disabled in 8.13 since it isn't used. */
63087c478bd9Sstevel@tonic-gate "_FFR_QUEUEDELAY",
63097c478bd9Sstevel@tonic-gate #endif /* _FFR_QUEUEDELAY */
63107c478bd9Sstevel@tonic-gate #if _FFR_QUEUE_GROUP_SORTORDER
63117c478bd9Sstevel@tonic-gate /* Allow QueueSortOrder per queue group. */
63127c478bd9Sstevel@tonic-gate /* XXX: Still need to actually use qgrp->qg_sortorder */
63137c478bd9Sstevel@tonic-gate "_FFR_QUEUE_GROUP_SORTORDER",
63147c478bd9Sstevel@tonic-gate #endif /* _FFR_QUEUE_GROUP_SORTORDER */
63157c478bd9Sstevel@tonic-gate #if _FFR_QUEUE_MACRO
63167c478bd9Sstevel@tonic-gate /* Define {queue} macro. */
63177c478bd9Sstevel@tonic-gate "_FFR_QUEUE_MACRO",
63187c478bd9Sstevel@tonic-gate #endif /* _FFR_QUEUE_MACRO */
63197c478bd9Sstevel@tonic-gate #if _FFR_QUEUE_RUN_PARANOIA
6320445f2479Sjbeck /* Additional checks when doing queue runs; interval of checks */
63217c478bd9Sstevel@tonic-gate "_FFR_QUEUE_RUN_PARANOIA",
63227c478bd9Sstevel@tonic-gate #endif /* _FFR_QUEUE_RUN_PARANOIA */
63237c478bd9Sstevel@tonic-gate #if _FFR_QUEUE_SCHED_DBG
63247c478bd9Sstevel@tonic-gate /* Debug output for the queue scheduler. */
63257c478bd9Sstevel@tonic-gate "_FFR_QUEUE_SCHED_DBG",
63267c478bd9Sstevel@tonic-gate #endif /* _FFR_QUEUE_SCHED_DBG */
6327*e9af4bc0SJohn Beck #if _FFR_RCPTTHROTDELAY
6328*e9af4bc0SJohn Beck /* configurable delay for BadRcptThrottle */
6329*e9af4bc0SJohn Beck "_FFR_RCPTTHROTDELAY"
6330*e9af4bc0SJohn Beck #endif /* _FFR_RCPTTHROTDELAY */
63317c478bd9Sstevel@tonic-gate #if _FFR_REDIRECTEMPTY
63327c478bd9Sstevel@tonic-gate /*
63337c478bd9Sstevel@tonic-gate ** envelope <> can't be sent to mailing lists, only owner-
63347c478bd9Sstevel@tonic-gate ** send spam of this type to owner- of the list
63357c478bd9Sstevel@tonic-gate ** ---- to stop spam from going to mailing lists.
63367c478bd9Sstevel@tonic-gate */
63377c478bd9Sstevel@tonic-gate
63387c478bd9Sstevel@tonic-gate "_FFR_REDIRECTEMPTY",
63397c478bd9Sstevel@tonic-gate #endif /* _FFR_REDIRECTEMPTY */
63407c478bd9Sstevel@tonic-gate #if _FFR_RESET_MACRO_GLOBALS
63417c478bd9Sstevel@tonic-gate /* Allow macro 'j' to be set dynamically via rulesets. */
63427c478bd9Sstevel@tonic-gate "_FFR_RESET_MACRO_GLOBALS",
63437c478bd9Sstevel@tonic-gate #endif /* _FFR_RESET_MACRO_GLOBALS */
63447c478bd9Sstevel@tonic-gate #if _FFR_RHS
63457c478bd9Sstevel@tonic-gate /* Random shuffle for queue sorting. */
63467c478bd9Sstevel@tonic-gate "_FFR_RHS",
63477c478bd9Sstevel@tonic-gate #endif /* _FFR_RHS */
63487800901eSjbeck #if _FFR_RUNPQG
63497800901eSjbeck /*
63507800901eSjbeck ** allow -qGqueue_group -qp to work, i.e.,
63517800901eSjbeck ** restrict a persistent queue runner to a queue group.
63527800901eSjbeck */
63537800901eSjbeck
63547800901eSjbeck "_FFR_RUNPQG",
63557800901eSjbeck #endif /* _FFR_RUNPQG */
63567800901eSjbeck #if _FFR_SESSID
63577800901eSjbeck /* session id (for logging) */
63587800901eSjbeck "_FFR_SESSID",
63597800901eSjbeck #endif /* _FFR_SESSID */
63607c478bd9Sstevel@tonic-gate #if _FFR_SHM_STATUS
63617c478bd9Sstevel@tonic-gate /* Donated code (unused). */
63627c478bd9Sstevel@tonic-gate "_FFR_SHM_STATUS",
63637c478bd9Sstevel@tonic-gate #endif /* _FFR_SHM_STATUS */
636449218d4fSjbeck #if _FFR_LDAP_SINGLEDN
636549218d4fSjbeck /*
636649218d4fSjbeck ** The LDAP database map code in Sendmail 8.12.10, when
636749218d4fSjbeck ** given the -1 switch, would match only a single DN,
636849218d4fSjbeck ** but was able to return multiple attributes for that
636949218d4fSjbeck ** DN. In Sendmail 8.13 this "bug" was corrected to
637049218d4fSjbeck ** only return if exactly one attribute matched.
637149218d4fSjbeck **
6372445f2479Sjbeck ** Unfortunately, our configuration uses the former
637349218d4fSjbeck ** behaviour. Attached is a relatively simple patch
637449218d4fSjbeck ** to 8.13.4 which adds a -2 switch (for lack of a
637549218d4fSjbeck ** better option) which returns the single dn/multiple
637649218d4fSjbeck ** attributes.
637749218d4fSjbeck **
637849218d4fSjbeck ** Jeffrey T. Eaton, Carnegie-Mellon University
637949218d4fSjbeck */
638049218d4fSjbeck
638149218d4fSjbeck "_FFR_LDAP_SINGLEDN",
638249218d4fSjbeck #endif /* _FFR_LDAP_SINGLEDN */
63837c478bd9Sstevel@tonic-gate #if _FFR_SKIP_DOMAINS
63847c478bd9Sstevel@tonic-gate /* process every N'th domain instead of every N'th message */
63857c478bd9Sstevel@tonic-gate "_FFR_SKIP_DOMAINS",
63867c478bd9Sstevel@tonic-gate #endif /* _FFR_SKIP_DOMAINS */
63877c478bd9Sstevel@tonic-gate #if _FFR_SLEEP_USE_SELECT
63887c478bd9Sstevel@tonic-gate /* Use select(2) in libsm/clock.c to emulate sleep(2) */
63897c478bd9Sstevel@tonic-gate "_FFR_SLEEP_USE_SELECT ",
63907c478bd9Sstevel@tonic-gate #endif /* _FFR_SLEEP_USE_SELECT */
63917c478bd9Sstevel@tonic-gate #if _FFR_SPT_ALIGN
63927c478bd9Sstevel@tonic-gate /*
63937c478bd9Sstevel@tonic-gate ** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 64
63947c478bd9Sstevel@tonic-gate ** bit alignment, so unless each piece of argv and envp is a multiple
63957c478bd9Sstevel@tonic-gate ** of 8 bytes (including terminating NULL), initsetproctitle() won't
63967c478bd9Sstevel@tonic-gate ** use any of the space beyond argv[0]. Be sure to set SPT_ALIGN_SIZE
63977c478bd9Sstevel@tonic-gate ** if you use this FFR.
63987c478bd9Sstevel@tonic-gate */
63997c478bd9Sstevel@tonic-gate
64007c478bd9Sstevel@tonic-gate /* Chris Adams of HiWAAY Informations Services */
64017c478bd9Sstevel@tonic-gate "_FFR_SPT_ALIGN",
64027c478bd9Sstevel@tonic-gate #endif /* _FFR_SPT_ALIGN */
64037c478bd9Sstevel@tonic-gate #if _FFR_SS_PER_DAEMON
64047c478bd9Sstevel@tonic-gate /* SuperSafe per DaemonPortOptions: 'T' (better letter?) */
64057c478bd9Sstevel@tonic-gate "_FFR_SS_PER_DAEMON",
64067c478bd9Sstevel@tonic-gate #endif /* _FFR_SS_PER_DAEMON */
6407*e9af4bc0SJohn Beck #if _FFR_TESTS
6408*e9af4bc0SJohn Beck /* enable some test code */
6409*e9af4bc0SJohn Beck "_FFR_TESTS",
6410*e9af4bc0SJohn Beck #endif /* _FFR_TESTS */
64117c478bd9Sstevel@tonic-gate #if _FFR_TIMERS
64127c478bd9Sstevel@tonic-gate /* Donated code (unused). */
64137c478bd9Sstevel@tonic-gate "_FFR_TIMERS",
64147c478bd9Sstevel@tonic-gate #endif /* _FFR_TIMERS */
64157c478bd9Sstevel@tonic-gate #if _FFR_TLS_1
64167c478bd9Sstevel@tonic-gate /* More STARTTLS options, e.g., secondary certs. */
64177c478bd9Sstevel@tonic-gate "_FFR_TLS_1",
64187c478bd9Sstevel@tonic-gate #endif /* _FFR_TLS_1 */
64197c478bd9Sstevel@tonic-gate #if _FFR_TRUSTED_QF
64207c478bd9Sstevel@tonic-gate /*
64217c478bd9Sstevel@tonic-gate ** If we don't own the file mark it as unsafe.
64227c478bd9Sstevel@tonic-gate ** However, allow TrustedUser to own it as well
64237c478bd9Sstevel@tonic-gate ** in case TrustedUser manipulates the queue.
64247c478bd9Sstevel@tonic-gate */
64257c478bd9Sstevel@tonic-gate
64267c478bd9Sstevel@tonic-gate "_FFR_TRUSTED_QF",
64277c478bd9Sstevel@tonic-gate #endif /* _FFR_TRUSTED_QF */
64287c478bd9Sstevel@tonic-gate #if _FFR_USE_SEM_LOCKING
64297c478bd9Sstevel@tonic-gate "_FFR_USE_SEM_LOCKING",
64307c478bd9Sstevel@tonic-gate #endif /* _FFR_USE_SEM_LOCKING */
64317c478bd9Sstevel@tonic-gate #if _FFR_USE_SETLOGIN
64327c478bd9Sstevel@tonic-gate /* Use setlogin() */
64337c478bd9Sstevel@tonic-gate /* Peter Philipp */
64347c478bd9Sstevel@tonic-gate "_FFR_USE_SETLOGIN",
64357c478bd9Sstevel@tonic-gate #endif /* _FFR_USE_SETLOGIN */
64367c478bd9Sstevel@tonic-gate NULL
64377c478bd9Sstevel@tonic-gate };
64387c478bd9Sstevel@tonic-gate
6439