summaryrefslogtreecommitdiff
path: root/usr.sbin/sendmail/contrib
diff options
context:
space:
mode:
authorJason Downs <downsj@cvs.openbsd.org>1996-12-14 21:31:11 +0000
committerJason Downs <downsj@cvs.openbsd.org>1996-12-14 21:31:11 +0000
commit10f52d4df7efbe9ba76918c7958e87d885ff3ee5 (patch)
tree524bd2812bb0932035354b5dc14ae5c19db9f64a /usr.sbin/sendmail/contrib
parent608a01ad15ff5ab89386edfd559332580581c47d (diff)
Deletes and remaining changes.
Diffstat (limited to 'usr.sbin/sendmail/contrib')
-rw-r--r--usr.sbin/sendmail/contrib/rcpt-streaming305
-rw-r--r--usr.sbin/sendmail/contrib/xla/README207
-rw-r--r--usr.sbin/sendmail/contrib/xla/xla.c532
3 files changed, 0 insertions, 1044 deletions
diff --git a/usr.sbin/sendmail/contrib/rcpt-streaming b/usr.sbin/sendmail/contrib/rcpt-streaming
deleted file mode 100644
index a43af6d43f4..00000000000
--- a/usr.sbin/sendmail/contrib/rcpt-streaming
+++ /dev/null
@@ -1,305 +0,0 @@
-Message-ID: <wgKo1lW00WBw46OU8k@andrew.cmu.edu>
-Date: Sun, 1 Aug 1993 00:02:57 -0400 (EDT)
-From: John Gardiner Myers <jgm+@CMU.EDU>
-To: sendmail@cs.berkeley.edu
-Subject: contrib/rcpt-streaming
-Beak: Is
-
-This patch implements "RCPT streaming" in sendmail version 8. This
-patch is not an official part of sendmail. Please report all problems
-with this patch to jgm+@cmu.edu.
-
-RCPT streming avoids network round trips by sending all RCPT commands
-for a single SMTP transaction together. Sendmail then waits for all
-the replies, matching them up with the apropriate addresses.
-
-Apply to the sendmail src directory (your line numbers may vary) and
-compile with -DRCPTSTREAM
-
-diff -cr ./src/deliver.c /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/deliver.c
-*** ./src/deliver.c Thu Jul 22 14:28:19 1993
---- /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/deliver.c Fri Jul 30 21:11:16 1993
-***************
-*** 1334,1339 ****
---- 1334,1354 ----
- register int i;
-
- /* send the recipient list */
-+ #ifdef RCPTSTREAM
-+ /***********************************************************************
-+ *
-+ * RCPT streaming code by John G Myers, jgm+@cmu.edu
-+ * This is not supported by the maintainer of sendmail.
-+ * Report all bugs concerning RCPT streaming to jgm+@cmu.edu
-+ *
-+ ***********************************************************************
-+ */
-+ for (to = tochain; to != NULL; to = to->q_tchain)
-+ {
-+ smtpstreammessage("RCPT To:<%s>", m, mci,
-+ to->q_user);
-+ }
-+ #endif
- tobuf[0] = '\0';
- for (to = tochain; to != NULL; to = to->q_tchain)
- {
-diff -cr ./src/usersmtp.c /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/usersmtp.c
-*** ./src/usersmtp.c Mon Jul 19 23:50:43 1993
---- /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/usersmtp.c Fri Jul 30 21:12:00 1993
-***************
-*** 44,49 ****
---- 44,61 ----
-
- # include <sysexits.h>
- # include <errno.h>
-+ #ifdef RCPTSTREAM
-+ /***********************************************************************
-+ *
-+ * RCPT streaming code by John G Myers, jgm+@cmu.edu
-+ * This is not supported by the maintainer of sendmail.
-+ * Report all bugs concerning RCPT streaming to jgm+@cmu.edu
-+ *
-+ ***********************************************************************
-+ */
-+ # include <sys/types.h>
-+ # include <sys/time.h>
-+ #endif
-
- # ifdef SMTP
-
-***************
-*** 62,67 ****
---- 74,87 ----
- char SmtpError[MAXLINE] = ""; /* save failure error messages */
- int SmtpPid; /* pid of mailer */
-
-+ #ifdef RCPTSTREAM
-+ char *SmtpStreamBuf; /* buffer for streaming output */
-+ int SmtpStreamBufSize = 0; /* allocated size of buffer */
-+ char *SmtpStreamStart; /* pointer to text not yet written */
-+ int SmtpStreamLen = 0; /* # chars not yet written */
-+ #endif
-+
-+
- #ifdef __STDC__
- extern smtpmessage(char *f, MAILER *m, MCI *mci, ...);
- #endif
-***************
-*** 404,410 ****
---- 424,434 ----
- {
- register int r;
-
-+ #ifdef RCPTSTREAM
-+ sprintf(SmtpMsgBuffer, "RCPT To:<%s>", to->q_user);
-+ #else
- smtpmessage("RCPT To:<%s>", m, mci, to->q_user);
-+ #endif
-
- SmtpPhase = mci->mci_phase = "client RCPT";
- setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase);
-***************
-*** 667,672 ****
---- 694,703 ----
- bool firstline = TRUE;
- char junkbuf[MAXLINE];
-
-+ #ifdef RCPTSTREAM
-+ extern char MsgBuf[]; /* err.c */
-+ #endif
-+
- if (mci->mci_out != NULL)
- (void) fflush(mci->mci_out);
-
-***************
-*** 682,687 ****
---- 713,755 ----
- register char *p;
- extern time_t curtime();
-
-+ #ifdef RCPTSTREAM
-+ if (SmtpStreamLen > 0) {
-+ int outfd;
-+
-+ outfd = fileno(mci->mci_out);
-+
-+ nonblock(outfd, TRUE);
-+ r = write(outfd, SmtpStreamStart, SmtpStreamLen);
-+ nonblock(outfd, FALSE);
-+ if (r == -1 && errno != EAGAIN
-+ #ifdef EWOULDBLOCK
-+ && errno != EWOULDBLOCK
-+ #endif
-+ ) {
-+
-+ mci->mci_errno = errno;
-+ message("451 streamreply: write error to %s",
-+ mci->mci_host);
-+
-+ /* if debugging, pause so we can see state */
-+ if (tTd(18, 100))
-+ pause();
-+ # ifdef LOG
-+ if (LogLevel > 0)
-+ syslog(LOG_INFO, "%s", &MsgBuf[4]);
-+ # endif /* LOG */
-+ /* stop trying to write output */
-+ SmtpStreamLen = 0;
-+ continue;
-+ }
-+ if (r > 0) {
-+ SmtpStreamStart += r;
-+ SmtpStreamLen -= r;
-+ }
-+ }
-+ #endif /* RCPTSTREAM */
-+
- /* actually do the read */
- if (e->e_xfp != NULL)
- (void) fflush(e->e_xfp); /* for debugging */
-***************
-*** 792,797 ****
---- 860,937 ----
-
- return (r);
- }
-+
-+ #ifdef RCPTSTREAM
-+ /*
-+ ** SMTPSTREAMMESSAGE -- buffer message to be streamed to server
-+ **
-+ ** Parameters:
-+ ** f -- format
-+ ** m -- the mailer to control formatting.
-+ ** a, b, c -- parameters
-+ **
-+ ** Returns:
-+ ** none.
-+ **
-+ ** Side Effects:
-+ ** stores message in SmtpStreamBuf
-+ */
-+
-+ /*VARARGS1*/
-+ #ifdef __STDC__
-+ smtpstreammessage(char *f, MAILER *m, MCI *mci, ...)
-+ #else
-+ smtpstreammessage(f, m, mci, va_alist)
-+ char *f;
-+ MAILER *m;
-+ MCI *mci;
-+ va_dcl
-+ #endif
-+ {
-+ VA_LOCAL_DECL
-+ int len;
-+
-+ VA_START(mci);
-+ (void) vsprintf(SmtpMsgBuffer, f, ap);
-+ VA_END;
-+
-+ if (tTd(18, 1) || Verbose)
-+ nmessage(">>> %s", SmtpMsgBuffer);
-+ if (TrafficLogFile != NULL)
-+ fprintf(TrafficLogFile, "%05d >>> %s\n", getpid(), SmtpMsgBuffer);
-+
-+ if (mci->mci_out == NULL) {
-+ if (tTd(18, 1)) printf("smtpstreammessage: NULL mci_out\n");
-+ return;
-+ }
-+
-+ strcat(SmtpMsgBuffer, m == NULL ? "\r\n" : m->m_eol);
-+ len = strlen(SmtpMsgBuffer);
-+
-+ if (SmtpStreamLen == 0) {
-+ if (SmtpStreamBufSize == 0) {
-+ SmtpStreamBufSize = MAXLINE;
-+ SmtpStreamBuf = xalloc(SmtpStreamBufSize);
-+ }
-+ SmtpStreamStart = SmtpStreamBuf;
-+ }
-+
-+ if (SmtpStreamBufSize - SmtpStreamLen < len + 1) {
-+ int start = SmtpStreamStart - SmtpStreamBuf;
-+ SmtpStreamBufSize += MAXLINE;
-+ SmtpStreamBuf = realloc(SmtpStreamBuf, SmtpStreamBufSize);
-+ if (!SmtpStreamBuf) {
-+ syserr("Out of memory!!");
-+ abort();
-+ /* exit(EX_UNAVAILABLE); */
-+ }
-+ SmtpStreamStart = SmtpStreamBuf + start;
-+ }
-+
-+ strcpy(SmtpStreamBuf + SmtpStreamLen, SmtpMsgBuffer);
-+ SmtpStreamLen += len;
-+ }
-+ #endif /* RCPTSTREAM */
- /*
- ** SMTPMESSAGE -- send message to server
- **
-Only in /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src: usersmtp.c~
-diff -cr ./src/util.c /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/util.c
-*** ./src/util.c Mon Jul 19 23:50:45 1993
---- /afs/andrew.cmu.edu/system/src/local/../host/oldsmail/016/src/util.c Mon Jul 26 17:17:10 1993
-***************
-*** 1034,1039 ****
---- 1034,1091 ----
- return (FALSE);
- return (TRUE);
- }
-+
-+ #ifdef RCPTSTREAM
-+ /***********************************************************************
-+ *
-+ * RCPT streaming code by John G Myers, jgm+@cmu.edu
-+ * This is not supported by the maintainer of sendmail.
-+ * Report all bugs concerning RCPT streaming to jgm+@cmu.edu
-+ *
-+ ***********************************************************************
-+ */
-+
-+ #include <fcntl.h>
-+
-+ /*
-+ ** NONBLOCK -- set or clear non-blocking mode on file descriptor
-+ **
-+ ** Parameters:
-+ ** fd -- the file descriptor
-+ ** mode -- TRUE to set non-blocking mode
-+ ** FALSE to clear non-blocking mode
-+ **
-+ ** Returns:
-+ ** none
-+ **
-+ ** Side Effects:
-+ ** modifies nonblocking status of fd
-+ */
-+
-+ nonblock(fd, mode)
-+ int fd;
-+ bool mode;
-+ {
-+ int flags;
-+
-+ flags = fcntl(fd, F_GETFL, 0);
-+ if (mode) {
-+ #ifdef FNONBIO
-+ flags |= FNONBIO;
-+ #else
-+ flags |= O_NDELAY;
-+ #endif
-+ }
-+ else {
-+ #ifdef FNONBIO
-+ flags &= ~FNONBIO;
-+ #else
-+ flags &= ~O_NDELAY;
-+ #endif
-+ }
-+ fcntl(fd, F_SETFL, flags);
-+ }
-+ #endif
- /*
- ** STRCONTAINEDIN -- tell if one string is contained in another
- **
diff --git a/usr.sbin/sendmail/contrib/xla/README b/usr.sbin/sendmail/contrib/xla/README
deleted file mode 100644
index a72fd03c832..00000000000
--- a/usr.sbin/sendmail/contrib/xla/README
+++ /dev/null
@@ -1,207 +0,0 @@
- XLA - Extended Load Average design for Sendmail R6
- --------------------------------------------------
-
- Christophe Wolfhugel - Herve Schauer Consultants
- wolf@grasp.insa-lyon.fr, wolf@hsc-sec.fr
-
-
-WARNING: this extension is supplied as a contribution to Sendmail.
-Should you have trouble, questions, please contact me directly, and
-*not* the Sendmail development team.
-
-
-ABSTRACT
-
-Sendmail currently furnishes a limitation mecanism which is based on
-the system load average, when available. Experience has prooven that
-this was not sufficiant for some particular situations, for example
-if you have slow and/or overloaded links. This can easily cause both
-system and network congestions with Sendmail having to handle a large
-number of simultaneous sessions on the same overloaded link, causing
-most of the SMTP sessions to timeout after a long time. The system
-load average is also generally too slow to react when your system
-gets a burst of incoming or outgoing SMTP sessions which on some
-stations can easily cause system unavailabilities.
-
-The extended load average module has been designed in order to furnish
-a way of limitation the load generated by Sendmail to both your
-system and your network. This design can be used either alone or as
-complementary to the system load average if your system supports it.
-
-Limitation is based on the number of incoming/outgoing SMTP sessions,
-and remote hosts are classified in classes. The system administrator
-will define a maximum number of incoming SMTP sessions as well as
-a maximum total (incoming + outgoing) sessions for each class of
-hosts. A class can be either an individual machine or a network.
-
-When the limit is reached for a given class, all incoming SMTP
-connections will be politely refused. When the limit is reached for
-all classes, the SMTP connections will be refused by the system
-(which one could consider as less politely :)).
-On outgoing mail, messages will be queued for delayed processing.
-
-The extended load average parameters are given in the Sendmail
-configuration file, and when not present, Sendmail behaves the
-usual way.
-
-
-COMPILATION
-
-Copy the xla.c module in the src sub-directory, edit the Makefile
-in order to define XLA (-DXLA). Also add the xla.[co] module name
-in the list of files so that it gets compiled.
-
-Regenerate sendmail by removing all objects, or at least those
-containing references to XLA (this list may vary, so use grep to
-get the module list). This will generate a new sendmail executable
-containing the xla code.
-
-Debugging level 59 has been assigned to this module and when used
-it provides some output (sendmail -d59.x). Please check the source
-code to see which levels are supported.
-
-
-CONFIGURATION
-
-The extended average uses a new set of configuration lines in the
-sendmail.cf file. All newly introduced line begin with the letter L
-(capital L).
-
-Before detailling the syntax, first an example (this can be placed
-at any section of the sendmail.cf file, note that the order is
-important). Fields are separated by (one or more) tabs/spaces.
-
-# File name used to store the counters
-L/etc/sendmail.la
-# Classes definition
-# Lname #queue #reject
-L*.insa-lyon.fr 8 3
-L*.univ-lyon1.fr 6 4
-L* 15 16
-
-The first line defines the working file which will be used in order
-to have the occurences of Sendmail read and update the counters. The
-format of this file is described in the "Design" section.
-This line is mandatory and the specified file must be absolute (ie
-begin with a slash).
-
-Then you can specify one or more classes. The last class (*) is also
-mandatory and should be in last position as the first match will stop
-the search and if there is no match the behavior of Sendmail is unknown.
-
-Each class has three fields separated by one or more tabs/spaces.
-
-L{mask} {queue_#} {refuse_#}
-
-The {mask} is a simple mask. It can be either an explicit host name
-(like grasp.insa-lyon.fr) or a mask starting with "*." or just "*".
-No other variants are allowed.
-
-Lgrasp.insa-lyon.fr will match exactely any session to/from this host.
-
-L*.insa-lyon.fr will match any session to/from any machine in the
- insa-lyon.fr domain as well as from the machine
- named "insa-lyon.fr" if it exists.
-
-L* will match any session, and thus should also be
- last in the list to act as a catchup line.
-
-The {queue_#} is the maximum number of SMTP sessions in the given class
-for both incoming and outgoing messages. The {refuse_#} indicates when
-to refuse incoming messages for this class. The interaction between
-those counters is somewhat subtle. It seems logical that a standard
-configuration has {queue_#} >= {refuse_#}, and in fact in most
-configurations they can be equal (that's why what I use in my environment).
-Thus, this is not mandatory. If {queue_#} < {refuse_#} outgoing messages
-will be lower priority than incoming messages and once a class gets loaded
-the outgoing messages are blocked first.
-
-I use very low values in some situations, for example I have a customer
-connected to the Internet via a 9600 bps line, they also have internal
-users sending burst of messages (10, 20 small messages coming in just
-one or two seconds). Both situations were unsupportable. The line is
-too slow to handle many simultaneous connections and the mail server
-does not have the ressources to handle such a heavy load (it's a 12 Megs
-Sun 3 also doing Usenet news).
-
-I have defined following section in the configuration file, and experience
-shows the benefits for everyone. Fake domain for the example: customer.fr.
-
-L/etc/sendmail.la
-L*.customer.fr 8 8
-L* 3 3
-
-This means that there might not be more than 8 simultaneous SMTP sessions
-between the mail server and any other internal host. This is to protect
-the station from heavy loads like users (or applications !) sending
-several tenths of messages in just a few seconds).
-No more than 3 SMTP sessions are authorized with any other host, this is
-to save the load of the slow 9600 line to the Internet.
-
-Drawback is that is you have 3 * 2 Megs sessions established from/to the
-outside, all your mail will be held until one slot gets available, on
-a 9600 bps line just make your counts, il blocks your line during over
-one hour.
-
-
-DESIGN
-
-Sendmail will analyze the "L" lines in the configuration file during
-startup (or read the initialized structure from the frozen file).
-When started in daemon mode (and only there), any existing working file
-will be cleared and a new one is created. Each class gets a record in
-the sendmail.la work file. The size of this record is a short integer
-(generally two bytes) and represents the count of active sessions in
-the given class. Read/Write operations in this file are done in
-one operation (as anyway the size is far below one disk sector). The
-file is locked with Sendmail's lockfile() function priori to any
-access.
-
-Handling incoming SMTP sessions.
-
-There is interaction is two points in the Sendmail source code. First
-on the listen system call: if all slots in all classes are in use,
-a listen(0) is done so that the system rejects any incoming SMTP session.
-This avois to fork and then reject the connexion.
-
-If there are some free slots, nothing better than accepting the
-connection, then forking can be done. The child process then checks if
-the adequate class is full or not. If full, it rejects the connection
-with a "421 Too many sessions" diagnostic to the sender (which should
-then appear when the remote users do a mailq). If the treshold {reject_#}
-is not reached, the connection is accepted and the counter is sendmail.la
-is updated.
-
-Handling outgoing SMTP sessions.
-
-As soon as Sendmail needs to connect to a distant host, the adequate class
-is checked against {queue_#} and if no slots are available, the message is
-queued for further processing.
-
-Sendmail's connection caching.
-
-Sendmail-R6 introduces a new design: connection caching, ie several SMTP
-sessions can be opened at the same time. This could cause some problems
-when sending mail, as after having a few connections opened, all slots
-could be in use and generate a partial delivery of the message. In
-order to deal with this, xla.c uses following design "for a given
-sendmail process, only the first connection in a given class is counted".
-This can be done because sendmail does not do parralel message sending
-on the different channels.
-
-End of connection.
-
-As soon as a connection is closed, the counters will be automatically
-updated.
-
-
-
-Please look at the code to understand of all this works. Comments,
-suggestions, questions welcome.
-
-
-
- Christophe Wolfhugel
- Herve Schauer Consultants
- Paris, France
- May 23, 1993
diff --git a/usr.sbin/sendmail/contrib/xla/xla.c b/usr.sbin/sendmail/contrib/xla/xla.c
deleted file mode 100644
index 627d383676b..00000000000
--- a/usr.sbin/sendmail/contrib/xla/xla.c
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * (C) Copyright 1993-94, Herve Schauer Consultants
- *
- * This module written by Christophe.Wolfhugel@hsc-sec.fr
- * is to be used under the same conditions and terms (and absence
- * or warranties) than the other modules of the Sendmail package.
- *
- * ABSOLUTELY NO WARRANTY. USE AT YOUR OWN RISKS.
- *
- * Version: 940417, applied a patch from Paul Graham <pjg@acsu.buffalo.edu>
- * (lockfile syntax in xla.c did not reflect anymore the
- * new one used by sendmail, now fine).
- *
- */
-
-
-#ifdef XLA
-
-#ifndef MAXLARULES
-# define MAXLARULES 20
-#endif
-
-# include "sendmail.h"
-
-typedef struct {
- short queue; /* # of connexions to have queueing */
- short reject; /* # of conn. to reject */
- short num; /* # of increments this process */
- char *mask; /* Mask (domain) */
- } XLARULE;
-
-char *XlaFname; /* Work file name */
-char XlaHostName[1024]; /* Temporary */
-int XlaNext; /* # of XlaRules */
-pid_t XlaPid; /* Pid updating the tables */
-XLARULE XlaRules[MAXLARULES]; /* The rules themselves */
-short XlaCtr[MAXLARULES]; /* Counter (for work file only) */
-
-extern bool lockfile();
-
-/*
-** XLAMATCH -- Matches a fnmatch like expression.
-**
-** Parameters:
-** mask -- mask to match the string too;
-** name -- string.
-**
-** Mask can either be a plain string or a simplified fnmatch like mask:
-** *.string or string.*
-** No other alternatives are accepted.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** none.
-*/
-
-bool
-XlaMatch(mask, name)
- char *mask, *name;
-{
- int l1, l2;
-
- l1 = strlen(mask); l2 = strlen(name);
- if (l1 == 1 && mask[0] == '*') return(TRUE);
- if (mask[0] == '*' && mask[1] == '.') {
- if (l2 < (l1 - 2)) return(FALSE);
- if (strcasecmp(&mask[2], name) == 0) return(TRUE);
- if (strcasecmp(&mask[1], name + l2 - l1 + 1) == 0) return(TRUE);
- return(FALSE);
- }
- if (l1 < 3) return(FALSE);
- if (mask[l1 -1] == '*') {
- if (l2 < l1 - 1) return(FALSE);
- if (strncasecmp(mask, name, l1 - 1) == 0) return(TRUE);
- return(FALSE);
- }
- if (strcasecmp(mask, name) == 0) return(TRUE);
- return(FALSE);
-}
-
-/*
-** XLAZERO -- Zeroes the used variables
-**
-** Just initializes some variables, called once at sendmail
-** startup.
-**
-** Parameters:
-** none.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** none.
-*/
-
-xla_zero()
-{
- if (tTd(59, 1)) {
- printf("xla_zero\n");
- }
- XlaFname = NULL;
- XlaNext = 0;
- XlaPid = 0;
- memset((char *) &XlaRules[0], 0, sizeof(XLARULE) * MAXLARULES);
-}
-
-
-/*
-** XLAINIT -- initialized extended load average stuff
-**
-** This routine handles the L lines appearing in the configuration
-** file.
-**
-** L/etc/sendmail.la indicates the working file
-** Lmask #1 #2 Xtended LA to apply to mask
-** #1 = Queueing # of connections
-** #2 = Reject connections.
-**
-** Parameters:
-** line -- the cf file line to parse.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Builds several internal tables.
-*/
-
-xla_init(line)
- char *line;
-{
- char *s;
-
- if (tTd(59, 1)) {
- printf("xla_init line: %s\n", line);
- }
- if (XlaFname == NULL && *line == '/') { /* Work file name */
- XlaFname = newstr(line);
- if (tTd(59, 10))
- printf("xla_init: fname = %s\n", XlaFname);
- return;
- }
- if (XlaNext == MAXLARULES) {
- syserr("too many xla rules defined (%d max)", MAXLARULES);
- return;
- }
- s = strtok(line, " \t");
- if (s == NULL) {
- syserr("xla: line unparseable");
- return;
- }
- XlaRules[XlaNext].mask = newstr(s);
- s = strtok(NULL, " \t");
- if (s == NULL) {
- syserr("xla: line unparseable");
- return;
- }
- XlaRules[XlaNext].queue = atoi(s);
- s = strtok(NULL, " \t");
- if (s == NULL) {
- syserr("xla: line unparseable");
- return;
- }
- XlaRules[XlaNext].reject = atoi(s);
- if (tTd(59, 10))
- printf("xla_init: rule #%d = %s q=%d r=%d\n", XlaNext,
- XlaRules[XlaNext].mask,
- XlaRules[XlaNext].queue, XlaRules[XlaNext].reject);
- XlaNext++;
-}
-
-
-/*
-** XLACREATEFILE -- Create the working file
-**
-** Tries to create the working file, called each time sendmail is
-** invoked with the -bd option.
-**
-** Parameters:
-** none.
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Creates the working file (sendmail.la) and zeroes it.
-*/
-
-xla_create_file()
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_create_file:\n");
- if (XlaFname == NULL) return;
- fd = open(XlaFname, O_RDWR|O_CREAT, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_create_file: open failed");
- return;
- }
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_create_file: can't set lock");
- return;
- }
- if (ftruncate(fd, 0) == -1) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_create_file: can't truncate XlaFname");
- return;
- }
- if (write(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- XlaFname == NULL;
- syserr("xla_create_file: can't write XlaFname");
- }
- close(fd);
-}
-
-
-/*
-** XLASMTPOK -- Checks if all slots are in use
-**
-** Check is there are still some slots available for an SMTP
-** connection.
-**
-** Parameters:
-** none.
-**
-** Returns:
-** TRUE -- slots are available;
-** FALSE -- no more slots.
-**
-** Side Effects:
-** Reads a file, uses a lock and updates sendmail.la if a slot
-** is free for use.
-*/
-
-bool
-xla_smtp_ok()
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_smtp_ok:\n");
- if (XlaFname == NULL) return(TRUE);
- fd = open(XlaFname, O_RDWR, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_smtp_ok: open failed");
- return(TRUE);
- }
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_smtp_ok: can't set lock");
- return(TRUE);
- }
- if (read(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_smtp_ok: can't read XlaFname");
- return(TRUE);
- }
- close(fd);
- for (i = 0; i < XlaNext; i++) {
- if (XlaCtr[i] < XlaRules[i].reject)
- return(TRUE);
- }
- return(FALSE);
-}
-
-
-/*
-** XLAHOSTOK -- Can we accept a connection from this host
-**
-** Check the quota for the indicated host
-**
-** Parameters:
-** name -- host name or IP# (string)
-**
-** Returns:
-** TRUE -- we can accept the connection;
-** FALSE -- we must refuse the connection.1
-**
-** Side Effects:
-** Reads and writes a file, uses a lock and still updates
-** sendmail.la is a slot gets assigned.
-*/
-
-bool
-xla_host_ok(name)
- char *name;
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_host_ok:\n");
- if (XlaFname == NULL) return(TRUE);
- fd = open(XlaFname, O_RDWR, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_host_ok: open failed");
- return(TRUE);
- }
- XlaPid = getpid();
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_host_ok: can't set lock");
- return(TRUE);
- }
- if (read(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_smtp_ok: can't read XlaFname");
- return(TRUE);
- }
- strncpy(XlaHostName, name, sizeof(XlaHostName) -1);
- XlaHostName[sizeof(XlaHostName) -1] = 0;
- i = strlen(name) - 1;
- if (i >= 0 && XlaHostName[i] == '.') XlaHostName[i] = 0;
- for (i = 0; i < XlaNext; i++) {
- if (XlaMatch(XlaRules[i].mask, XlaHostName)) {
- if (XlaCtr[i] < XlaRules[i].reject) {
- if (XlaRules[i].num++ == 0) {
- XlaCtr[i]++;
- lseek(fd, i*sizeof(XlaCtr[i]), SEEK_SET);
- if (write(fd, &XlaCtr[i], sizeof(XlaCtr[i])) != sizeof(XlaCtr[i]))
- XlaFname = NULL;
- }
- close(fd);
- return(TRUE);
- }
- close(fd);
- return(FALSE);
- }
- }
- close(fd);
- return(TRUE);
-}
-
-/*
-** XLANOQUEUEOK -- Can we sent this message to the remote host
-**
-** Check if we can send to the remote host
-**
-** Parameters:
-** name -- host name or IP# (string)
-**
-** Returns:
-** TRUE -- we can send the message to the remote site;
-** FALSE -- we can't connect the remote host, queue.
-**
-** Side Effects:
-** Reads and writes a file, uses a lock.
-** And still updates the sendmail.la file.
-*/
-
-bool
-xla_noqueue_ok(name)
- char *name;
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_noqueue_ok:\n");
- if (XlaFname == NULL) return(TRUE);
- fd = open(XlaFname, O_RDWR, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_noqueue_ok: open failed");
- return(TRUE);
- }
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_noqueue_ok: can't set lock");
- return(TRUE);
- }
- XlaPid = getpid();
- if (read(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_noqueue_ok: can't read XlaFname");
- return(TRUE);
- }
- strncpy(XlaHostName, name, sizeof(XlaHostName) -1);
- XlaHostName[sizeof(XlaHostName) -1] = 0;
- i = strlen(name) - 1;
- if (i >= 0 && XlaHostName[i] == '.') XlaHostName[i] = 0;
- for (i = 0; i < XlaNext; i++) {
- if (XlaMatch(XlaRules[i].mask, XlaHostName)) {
- if (XlaCtr[i] < XlaRules[i].queue) {
- if (XlaRules[i].num++ == 0) {
- XlaCtr[i]++;
- lseek(fd, i*sizeof(XlaCtr[i]), SEEK_SET);
- if (write(fd, &XlaCtr[i], sizeof(XlaCtr[i])) != sizeof(XlaCtr[i]))
- XlaFname = NULL;
- }
- close(fd);
- return(TRUE);
- }
- close(fd);
- return(FALSE);
- }
- }
- close(fd);
- return(TRUE);
-}
-
-
-/*
-** XLAHOSTEND -- Notice that a connection is terminated.
-**
-** Updates the counters to reflect the end of an SMTP session
-** (in or outgoing).
-**
-** Parameters:
-** name -- host name or IP# (string)
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Reads and writes a file, uses a lock.
-** And still updates sendmail.la.
-*/
-
-xla_host_end(name)
- char *name;
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_host_end:\n");
- if (XlaFname == NULL || XlaPid != getpid()) return;
- fd = open(XlaFname, O_RDWR, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_host_end: open failed");
- return;
- }
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_host_end: can't set lock");
- return;
- }
- if (read(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_host_end: can't read XlaFname");
- return(TRUE);
- }
- strncpy(XlaHostName, name, sizeof(XlaHostName) -1);
- XlaHostName[sizeof(XlaHostName) -1] = 0;
- i = strlen(name) - 1;
- if (i >= 0 && XlaHostName[i] == '.') XlaHostName[i] = 0;
- for (i = 0; i < XlaNext; i++) {
- if (XlaMatch(XlaRules[i].mask, XlaHostName)) {
- if (XlaRules[i].num > 0 && XlaRules[i].num-- == 1) {
- if (XlaCtr[i]) XlaCtr[i]--;
- lseek(fd, i*sizeof(XlaCtr[i]), SEEK_SET);
- if (write(fd, &XlaCtr[i], sizeof(XlaCtr[i]))
- != sizeof(XlaCtr[i]))
- XlaFname = NULL;
- }
- close(fd);
- return;
- }
- }
- close(fd);
-}
-
-/*
-** XLAALLEND -- Mark all connections as closed.
-**
-** Generally due to an emergency exit.
-**
-** Parameters:
-** name -- host name or IP# (string)
-**
-** Returns:
-** none.
-**
-** Side Effects:
-** Reads and writes a file, uses a lock.
-** And guess what: updates sendmail.la.
-*/
-
-xla_all_end()
-{
- int fd, i;
-
- if (tTd(59, 1))
- printf("xla_all_end:\n");
- if (XlaFname == NULL || XlaPid != getpid()) return;
- fd = open(XlaFname, O_RDWR, 0644);
- if (fd == -1) {
- XlaFname = NULL;
- syserr("xla_all_end: open failed");
- return;
- }
- if (!lockfile(fd, XlaFname, NULL, LOCK_EX)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_all_end: can't set lock");
- return;
- }
- if (read(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- close(fd);
- XlaFname = NULL;
- syserr("xla_all_end: can't read XlaFname");
- return(TRUE);
- }
- for (i = 0; i < XlaNext; i++) {
- if (XlaCtr[i] > 0 && XlaRules[i].num > 0) {
- XlaCtr[i]--; XlaRules[i].num = 0;
- }
- }
- lseek(fd, 0, SEEK_SET);
- if (write(fd, XlaCtr, sizeof(XlaCtr)) != sizeof(XlaCtr)) {
- XlaFname = NULL;
- }
- close(fd);
-}
-#endif /* XLA */