📄 rcpt-streaming
字号:
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.eduSubject: contrib/rcpt-streamingBeak: IsThis patch implements "RCPT streaming" in sendmail version 8. Thispatch is not an official part of sendmail. Please report all problemswith this patch to jgm+@cmu.edu.RCPT streming avoids network round trips by sending all RCPT commandsfor a single SMTP transaction together. Sendmail then waits for allthe replies, matching them up with the apropriate addresses.Apply to the sendmail src directory (your line numbers may vary) andcompile with -DRCPTSTREAMdiff -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 **
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -