⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rcpt-streaming

📁 早期freebsd实现
💻
字号:
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 + -