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