亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? smtpcli.c

?? 很好的TCP_IP協議源代碼分析,很適用很好
?? C
?? 第 1 頁 / 共 2 頁
字號:
	/* Say HELO */
	sendcmd(cb,"HELO %s\n",Hostname);
	if(!Smtpbatch){
		rcode = getresp(cb,200);
		if(rcode == -1 || rcode >= 400)
			goto quit;
	}
	do {	/* For each message... */

		/* if this file open fails, skip it */
		if ((cb->tfile = fopen(cb->tname,READ_TEXT)) == NULL)
			continue;

		/* Send MAIL and RCPT commands */
		sendcmd(cb,"MAIL FROM:<%s>\n",cb->jobq->from);
		if(!Smtpbatch){
			rcode = getresp(cb,200);
			if(rcode == -1 || rcode >= 400)
				goto quit;
		}
		rcpts = 0;
		goodrcpt = 0;
		for (tp = cb->jobq->to; tp != NULL; tp = tp->next){
			sendcmd(cb,"RCPT TO:<%s>\n",tp->val);
			if(!Smtpbatch){
				rcode = getresp(cb,200);
				if(rcode == -1)
					goto quit;
				if(rcode < 400)
					goodrcpt = 1; /* At least one good */
			}
			rcpts++;
		}
		/* Send DATA command */
		sendcmd(cb,"DATA\n");
		if(!Smtpbatch){
			rcode = getresp(cb,200);
			if(rcode == -1 || rcode >= 400)
				goto quit;
		}
		if(Smtpbatch){
			/* Now wait for the responses to come back. The first time
			 * we do this, we wait first for the start banner and
			 * HELO response. In any case, we wait for the response to
			 * the MAIL command here.
			 */
			for(i= init ? 3 : 1;i > 0;i--){
				rcode = getresp(cb,200);
				if(rcode == -1 || rcode >= 400)
					goto quit;
			}
			init = 0;

			/* Now process the responses to the RCPT commands */
			for(i=rcpts;i!=0;i--){
				rcode = getresp(cb,200);
				if(rcode == -1)
					goto quit;
				if(rcode < 400)
					goodrcpt = 1; /* At least one good */
			}
			/* And finally get the response to the DATA command.
			 * Some servers will return failure here if no recipients
			 * are valid, some won't.
			 */
			rcode = getresp(cb,200);
			if(rcode == -1 || rcode >= 400)
				goto quit;

			/* check for no good rcpt on the list */
			if (goodrcpt == 0){
				sendcmd(cb,".\n");  /* Get out of data mode */
				goto quit;
			}
		}
		/* Send the file. This also closes it */
		smtpsendfile(cb);

		/* Wait for the OK response */
		rcode = getresp(cb,200);
		if(rcode == -1)
			goto quit;
		if((rcode >= 200 && rcode < 300) || rcode >= 500){
			/* if a good transfer or permanent failure remove job */

			if (cb->errlog != NULL)
				retmail(cb);
			/* Unlink the textfile */
			(void) unlink(cb->tname);
			(void) unlink(cb->wname);	/* unlink workfile */
			logmsg(s,"SMTP sent job %s To: %s From: %s",
			 cb->jobq->jobname,cb->jobq->to->val,cb->jobq->from);
		}
	} while(next_job(cb));
quit:
	sendcmd(cb,"QUIT\n");
	if (cb->errlog != NULL){
		retmail(cb);
		(void) unlink(cb->wname);	/* unlink workfile */
		(void) unlink(cb->tname);	/* unlink text */
	}
	(void) fclose(cb->network);
	if(cb->tfile != NULL)
		fclose(cb->tfile);
	cb->lock = 0;
	del_session(cb);
}


/* create mail lockfile */
int
mlock(dir,id)
char *dir,*id;
{
	char lockname[LINELEN];
	int fd;
	struct stat statbuf;

#ifdef	MSDOS
	if(strlen(id) > 8) {		/* truncate long filenames */
		id[8] = '\0';
		if(id[7] == '/')
			id[7] = '\0';
	}
#endif
	/* Try to create the lock file in an atomic operation */
	sprintf(lockname,"%s/%s.lck",dir,id);
#ifdef        AMIGA
	/* don't ask, really, just don't ask... I'd do file locking on
	 * an Amiga much more differently than this.
	 */
	if(access(lockname, 0) == 0)
		return -1;
#endif
	fd = open(lockname, O_WRONLY|O_EXCL|O_CREAT,0600);
	if(fd != -1){
		/* Lock succeeded */
		close(fd);
		return 0;
	}
	/* See if the dir doesn't exist */
	if(stat(dir,&statbuf) == -1 || (statbuf.st_mode & S_IFMT) != S_IFDIR){
		printf("Lock directory %s missing\n",dir);
		fflush(stdout);
		return 0;
	}
	return -1;	/* lock failed */
}

/* remove mail lockfile */
int
rmlock(dir,id)
char *dir,*id;
{
	char lockname[LINELEN];
#ifdef	MSDOS
	if(strlen(id) > 8) {		/* truncate long filenames */
		id[8] = '\0';
		if(id[7] == '/')
			id[7] = '\0';
	}
#endif
	sprintf(lockname,"%s/%s.lck",dir,id);
	return(unlink(lockname));
}

/* free the message struct and data */
static void
del_session(cb)
register struct smtpcli *cb;
{
	register struct smtp_job *jp,*tp;
	register int i;

	if (cb == NULL)
		return;
	for(i=0; i<MAXSESSIONS; i++) 
		if(cli_session[i] == cb) {
			cli_session[i] = NULL;
			break;
		}

	free(cb->wname);
	free(cb->tname);
	free(cb->destname);
	for (jp = cb->jobq; jp != NULL;jp = tp) {
			tp = jp->next;
			del_job(jp);
	}
	del_list(cb->errlog);
	free(cb);
	Smtpsessions--;	/* number of connections active */
}

static void
del_job(jp)
register struct smtp_job *jp;
{
	if ( *jp->jobname != '\0')
		(void) rmlock(Mailqdir,jp->jobname);
	free(jp->from);
	del_list(jp->to);
	free(jp);
}

/* delete a list of list structs */
void
del_list(lp)
struct list *lp;
{
	register struct list *tp, *tp1;
	for (tp = lp; tp != NULL; tp = tp1) {
		tp1 = tp->next;
		free(tp->val);
		free(tp);
	}
}

/* stub for calling mdaemon to return message to sender */
static void
retmail(cb)
struct smtpcli *cb;
{
	FILE *infile;
#ifdef SMTPTRACE
	if (Smtptrace > 5) {
		printf("smtp job %s returned to sender\n",cb->wname);
	}
#endif
	if ((infile = fopen(cb->tname,READ_TEXT)) == NULL)
		return;
	mdaemon(infile,cb->jobq->from,cb->errlog,1);
	fclose(infile);
}

/* look to see if a smtp control block exists for this ipdest */
static struct smtpcli *
lookup(destaddr)
int32 destaddr;
{
	register int i;

	for(i=0; i<MAXSESSIONS; i++) {
		if (cli_session[i] == NULL)
			continue;
		if(cli_session[i]->ipdest == destaddr)
			return cli_session[i];
	}
	return NULL;
}

/* create a new  smtp control block */
static struct smtpcli *
newcb()
{
	register int i;
	register struct smtpcli *cb;

	for(i=0; i<MAXSESSIONS; i++) {
		if(cli_session[i] == NULL) {
			cb = (struct smtpcli *)callocw(1,sizeof(struct smtpcli));
			cb->wname = mallocw((unsigned)strlen(Mailqdir)+JOBNAME);
			cb->tname = mallocw((unsigned)strlen(Mailqdir)+JOBNAME);
			cli_session[i] = cb;
			Smtpsessions++;	/* number of connections active */
			return(cb);
		}
	}
	return NULL;
}

static void
execjobs()
{
	register struct smtpcli *cb;
	register int i;

	for(i=0; i<MAXSESSIONS; i++) {
		cb = cli_session[i];
		if (cb == NULL) 
			continue;
		if(cb->lock)
			continue;

		sprintf(cb->tname,"%s/%s.txt",Mailqdir,cb->jobq->jobname);
		sprintf(cb->wname,"%s/%s.wrk",Mailqdir,cb->jobq->jobname);

		newproc("smtp_send", 1024, smtp_send, 0, cb,NULL,0);

#ifdef SMTPTRACE
		if (Smtptrace) 
			printf("Trying Connection to %s\n",inet_ntoa(cb->ipdest));
#endif


	}
}
	
/* add this job to control block queue */
static struct smtp_job *
setupjob(cb,id,from)
struct smtpcli *cb;
char *id,*from;
{
	register struct smtp_job *p1,*p2;

	p1 = (struct smtp_job *)callocw(1,sizeof(struct smtp_job));
	p1->from = strdup(from);
	strcpy(p1->jobname,id);
	/* now add to end of jobq */
	if ((p2 = cb->jobq) == NULL)
		cb->jobq = p1;
	else {
		while(p2->next != NULL)
			p2 = p2->next;
		p2->next = p1;
	}
	return p1;
}

/* called to advance to the next job */
static int
next_job(cb)
register struct smtpcli *cb;
{
	register struct smtp_job *jp;

	jp = cb->jobq->next;
	del_job(cb->jobq);
	/* remove the error log of previous message */
	del_list(cb->errlog);
	cb->errlog = NULL;
	cb->jobq = jp;
	if (jp == NULL)
		return 0;
	sprintf(cb->tname,"%s/%s.txt",Mailqdir,jp->jobname);
	sprintf(cb->wname,"%s/%s.wrk",Mailqdir,jp->jobname);
#ifdef SMTPTRACE
	if (Smtptrace > 5) {
		printf("sending job %s\n",jp->jobname);
	}
#endif
		return 1;

}


/* Mail routing function. For now just use the hosts file */
int32
mailroute(dest)
char *dest;
{
	int32 destaddr;

	/* look up address or use the gateway */
	destaddr = resolve_mx(dest);
	if (destaddr == 0 && (destaddr = resolve(dest)) == 0)
		if (Gateway != 0) 
			destaddr = Gateway; /* Use the gateway  */
	return destaddr;
	
}

/* save line in error list */
static void
logerr(cb,line)
struct smtpcli *cb;
char *line;
{
	register struct list *lp,*tp;
	tp = (struct list *)callocw(1,sizeof(struct list));
	tp->val = strdup(line);
	/* find end of list */
	if ((lp = cb->errlog) == NULL)
		cb->errlog = tp;
	else {
		while(lp->next != NULL)
			lp = lp->next;
		lp->next = tp;
	}
}

static int
smtpsendfile(cb)
register struct smtpcli *cb;
{
	int error = 0;

	strcpy(cb->buf,"\n");
	while(fgets(cb->buf,sizeof(cb->buf),cb->tfile) != NULL) {
		/* Escape a single '.' character at the beginning of a line */
		if(strcmp(cb->buf,".\n") == 0)
			putc('.',cb->network);
		fputs(cb->buf,cb->network);
	}
	fclose(cb->tfile);
	cb->tfile = NULL;
	/* Send the end-of-message command */
	if(cb->buf[strlen(cb->buf)-1] == '\n')
		sendcmd(cb,".\n");
	else
		sendcmd(cb,"\n.\n");
	return error;
}
/* do a printf() on the network stream with optional local tracing */
static void
sendcmd(struct smtpcli *cb,char *fmt, ...)
{
	va_list args;

	va_start(args,fmt);
#ifdef	SMTPTRACE
	if(Smtptrace){
		printf("smtp sent: ");
		vprintf(fmt,args);
	}
#endif
	vsprintf(cb->buf,fmt,args);
	fputs(cb->buf,cb->network);
	va_end(args);
}

/* Wait for, read and display response from server. Return the result code. */
static int
getresp(cb,mincode)
struct smtpcli *cb;
int mincode;	/* Keep reading until at least this code comes back */
{
	int rval;
	char line[LINELEN];

	fflush(cb->network);
	for(;;){
		/* Get line */
		if(fgets(line,LINELEN,cb->network) == NULL){
			rval = -1;
			break;
		}
		rip(line);		/* Remove cr/lf */
		rval = atoi(line);
#ifdef	SMTPTRACE
		if(Smtptrace)
			printf("smtp recv: %s\n",line);/* Display to user */
#endif
		if(rval >= 500) {	/* Save permanent error replies */
			char tmp[LINELEN];
			if(cb->errlog == NULL) {
				sprintf(tmp,"While talking to %s:",
					cb->destname);
				logerr(cb,tmp);
			}
			if(cb->buf[0] != '\0') { /* Save offending command */
				rip(cb->buf);
				sprintf(tmp,">>> %s",cb->buf);
				logerr(cb,tmp);
				cb->buf[0] = '\0';
			}
			sprintf(tmp,"<<< %s",line);
			logerr(cb,tmp);		/* save the error reply */
		}
		/* Messages with dashes are continued */
		if(line[3] != '-' && rval >= mincode)
			break;
	}
	return rval;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡电影一区二区三区| 亚洲人成网站影音先锋播放| 欧美日韩不卡一区| 色狠狠av一区二区三区| 色婷婷激情综合| 色婷婷综合久久久中文字幕| 色一情一伦一子一伦一区| 色悠久久久久综合欧美99| 91国产福利在线| 欧美理论在线播放| 日韩免费观看高清完整版| 精品国产乱码久久久久久夜甘婷婷| 欧美成人高清电影在线| 久久免费偷拍视频| 国产精品久久综合| 又紧又大又爽精品一区二区| 亚洲国产精品久久久久秋霞影院 | 欧美国产精品一区二区三区| 国产亚洲女人久久久久毛片| 国产精品久久久久久久久免费樱桃 | 伊人色综合久久天天| 亚洲成av人片在www色猫咪| 日本欧美在线观看| 国产一区二区不卡| 97精品视频在线观看自产线路二| 94-欧美-setu| 欧美人体做爰大胆视频| www日韩大片| 亚洲色图视频免费播放| 亚洲成人综合视频| 国内一区二区视频| 99久久精品免费看国产| 91.com视频| 欧美国产日韩a欧美在线观看 | av在线这里只有精品| 在线亚洲免费视频| 日韩欧美在线网站| 国产精品久久久久一区二区三区 | 亚洲综合色成人| 日av在线不卡| 成人免费观看男女羞羞视频| 91福利国产精品| 久久这里只精品最新地址| 中文字幕一区二区三区精华液| 亚洲成人免费视| 国产v综合v亚洲欧| 欧美日本一区二区三区| 国产拍欧美日韩视频二区| 亚洲第一精品在线| 欧美午夜精品久久久久久孕妇| 99视频一区二区三区| 欧美日韩你懂得| 久久久久久麻豆| 一级特黄大欧美久久久| 国产综合久久久久久鬼色| 色偷偷成人一区二区三区91| 日韩久久久久久| 一区二区三区加勒比av| 国产精品69毛片高清亚洲| 欧美美女一区二区| 1区2区3区国产精品| 久久99久久99小草精品免视看| 色综合久久中文字幕| 久久久久国产一区二区三区四区| 亚洲午夜精品网| 99久久免费精品高清特色大片| 欧美videos中文字幕| 亚洲国产精品天堂| 91香蕉国产在线观看软件| 久久亚洲精精品中文字幕早川悠里| 亚洲国产欧美一区二区三区丁香婷| 丁香一区二区三区| 精品美女在线播放| 日韩精品欧美精品| 欧美视频精品在线观看| 国产精品理论在线观看| 国产一区二区h| 日韩欧美一区中文| 婷婷综合久久一区二区三区| 91麻豆高清视频| 国产精品久久久久久亚洲伦 | 国产成人av电影| 日韩欧美国产系列| 偷拍日韩校园综合在线| 欧美亚洲图片小说| 亚洲人123区| 99热99精品| 国产精品久久久久久久久久久免费看 | 亚洲国产精品一区二区尤物区| 99久久精品国产毛片| 国产精品网曝门| 国产mv日韩mv欧美| 国产日韩欧美a| 国产盗摄精品一区二区三区在线| 日韩欧美123| 久久成人免费网| 精品av久久707| 麻豆91小视频| 久久综合色8888| 国产一区二区三区免费播放 | 亚洲国产美国国产综合一区二区| 色乱码一区二区三区88| 亚洲区小说区图片区qvod| 色综合天天在线| 亚洲精品视频在线| 色乱码一区二区三区88| 一区二区三区美女| 精品视频全国免费看| 视频一区二区中文字幕| 日韩一区二区三区精品视频| 老鸭窝一区二区久久精品| 精品国产成人系列| 国产成人综合视频| 中文字幕国产精品一区二区| 成人性生交大片免费看中文| 国产精品久久网站| 色婷婷综合久久久| 亚洲一区二区三区三| 欧美一区二区三区四区在线观看| 日本欧美韩国一区三区| 久久久精品欧美丰满| av不卡一区二区三区| 亚洲一区视频在线| 日韩一区二区精品| 国产91精品一区二区麻豆亚洲| 国产精品久久影院| 欧美日韩视频在线观看一区二区三区 | 婷婷综合在线观看| 精品国产99国产精品| 成人黄色av电影| 一级特黄大欧美久久久| 欧美一区二区三区白人| 国产麻豆日韩欧美久久| 亚洲男女毛片无遮挡| 欧美喷水一区二区| 国产精品一区专区| 一区二区三区欧美日韩| 日韩女优av电影| 99国内精品久久| 蜜臀久久久99精品久久久久久| 国产视频一区二区在线| 欧美最猛性xxxxx直播| 激情图片小说一区| 有坂深雪av一区二区精品| 日韩三级在线观看| 97久久人人超碰| 久久精品国产第一区二区三区| 国产精品色婷婷久久58| 欧美精品乱码久久久久久按摩| 国产一区二区三区精品欧美日韩一区二区三区| 国产精品久线观看视频| 制服丝袜中文字幕一区| 国产69精品久久久久毛片 | 欧美综合在线视频| 国产一区二区三区蝌蚪| 亚洲动漫第一页| 国产视频不卡一区| 欧美乱妇一区二区三区不卡视频| 国产精品99久久久久久似苏梦涵 | 日韩国产一区二| 最新国产の精品合集bt伙计| 日韩一区二区三区四区| 色香色香欲天天天影视综合网| 老司机精品视频线观看86 | 国产一区二区三区综合| 午夜亚洲福利老司机| 国产精品国产精品国产专区不蜜 | 日韩一区二区三免费高清| 欧美一级日韩免费不卡| 国产很黄免费观看久久| 亚洲图片一区二区| 国产清纯在线一区二区www| 6080国产精品一区二区| 91浏览器打开| 国产精品一级黄| 久久精品国产在热久久| 亚洲国产一区二区在线播放| 国产精品理论片在线观看| 亚洲精品一区二区三区福利| 欧美美女一区二区在线观看| 色天天综合久久久久综合片| 国产91在线观看丝袜| 国产一区二区三区最好精华液| 三级精品在线观看| 亚洲高清免费视频| 亚洲精品午夜久久久| 亚洲天堂免费看| 中文字幕一区在线观看视频| 国产午夜精品理论片a级大结局| 欧美刺激午夜性久久久久久久| 欧美色图天堂网| 色88888久久久久久影院野外 | 国产偷v国产偷v亚洲高清| 精品少妇一区二区三区在线播放 | 在线观看一区不卡| 色香蕉成人二区免费| 色综合视频一区二区三区高清| 99久久精品免费看国产免费软件| 成人综合在线网站| 99综合电影在线视频|