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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? smtpcli.c

?? 很好的TCP_IP協(xié)議源代碼分析,很適用很好
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):

#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <setjmp.h>
#ifdef UNIX
#include <sys/types.h>
#endif
#ifdef	AMIGA
#include <stat.h>
#else
#include <sys/stat.h>
#endif
#ifdef	__TURBOC__
#include <dir.h>
#include <io.h>
#endif
#include "global.h"
#include <stdarg.h>
#include "mbuf.h"
#include "cmdparse.h"
#include "proc.h"
#include "socket.h"
#include "timer.h"
#include "netuser.h"
#include "smtp.h"
#include "dirutil.h"
#include "commands.h"
#include "session.h"

static struct timer Smtpcli_t;
static int32 Gateway;

#ifdef SMTPTRACE
static unsigned short Smtptrace = 0;		/* used for trace level */
static int dosmtptrace(int argc,char *argv[],void *p);
#endif

static unsigned  short Smtpmaxcli  = MAXSESSIONS;	/* the max client connections allowed */
static int Smtpsessions = 0;		/* number of client connections
					* currently open */
static int Smtpbatch;
int	Smtpmode = 0;

static struct smtpcli *cli_session[MAXSESSIONS]; /* queue of client sessions  */

static void del_job(struct smtp_job *jp);
static void del_session(struct smtpcli *cb);
static int dogateway(int argc,char *argv[],void *p);
static int dosmtpmaxcli(int argc,char *argv[],void *p);
static int dotimer(int argc,char *argv[],void *p);
static int dosmtpkill(int argc,char *argv[],void *p);
static int dosmtplist(int argc,char *argv[],void *p);
static int dobatch(int argc,char *argv[],void *p);
static void execjobs(void);
static int getresp(struct smtpcli *ftp,int mincode);
static void logerr(struct smtpcli *cb,char *line);
static struct smtpcli *lookup(int32 destaddr);
static struct smtpcli *newcb(void);
static int next_job(struct smtpcli *cb);
static void retmail(struct smtpcli *cb);
static void sendcmd(struct smtpcli *cb,char *fmt,...);
static int smtpsendfile(struct smtpcli *cb);
static int setsmtpmode(int argc,char *argv[],void *p);
static struct smtp_job *setupjob(struct smtpcli *cb,char *id,char *from);
static void smtp_send(int unused,void *cb1,void *p);
static int smtpkick(int argc,char *argv[],void *p);

static struct cmds Smtpcmds[] = {
	"batch",	dobatch,	0,	0,	NULL,
	"gateway",	dogateway,	0,	0,	NULL,
	"mode",		setsmtpmode,	0,	0,	NULL,
	"kick",		smtpkick,	0,	0,	NULL,
	"kill",		dosmtpkill,	0,	2,	"kill <jobnumber>",
	"list",		dosmtplist,	0,	0,	NULL,
	"maxclients",	dosmtpmaxcli,	0,	0,	NULL,
	"timer",	dotimer,	0,	0,	NULL,
#ifdef SMTPTRACE
	"trace",	dosmtptrace,	0,	0,	NULL,
#endif
	NULL,
};

int
dosmtp(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return subcmd(Smtpcmds,argc,argv,p);
}

static int
dobatch(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setbool(&Smtpbatch,"SMTP batching",argc,argv);
}
static int
dosmtpmaxcli(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setshort(&Smtpmaxcli,"Max clients",argc,argv);
}

static int
setsmtpmode(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	if (argc < 2) {
		printf("smtp mode: %s\n",
			(Smtpmode & QUEUE) ? "queue" : "route");
	} else {
		switch(*argv[1]) {
		case 'q':
			Smtpmode |= QUEUE;
			break;
		case 'r':
			Smtpmode &= ~QUEUE;
			break;
		default:
			printf("Usage: smtp mode [queue | route]\n");
			break;
		}
	}
	return 0;
}
static int
dogateway(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	int32 n;

	if(argc < 2){
		printf("%s\n",inet_ntoa(Gateway));
	} else if((n = resolve(argv[1])) == 0){
		printf(Badhost,argv[1]);
		return 1;
	} else
		Gateway = n;
	return 0;
}

#ifdef SMTPTRACE
static int
dosmtptrace(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setshort(&Smtptrace,"SMTP tracing",argc,argv);
}
#endif

/* list jobs wating to be sent in the mqueue */
static int
dosmtplist(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	char tstring[80];
	char line[20];
	char host[LINELEN];
	char to[LINELEN];
	char from[LINELEN];
	char *cp;
	char	status;
	struct stat stbuf;
	struct tm *tminfo, *localtime();
	FILE *fp;

	printf("S     Job    Size Date  Time  Host                 From\n");
	filedir(Mailqueue,0,line);
	while(line[0] != '\0') {
		sprintf(tstring,"%s/%s",Mailqdir,line);
		if ((fp = fopen(tstring,READ_TEXT)) == NULL) {
			printf("Can't open %s: %s\n",tstring,sys_errlist[errno]);
			continue;
		}
		if ((cp = strrchr(line,'.')) != NULL)
			*cp = '\0';
		sprintf(tstring,"%s/%s.lck",Mailqdir,line);
		if (access(tstring,0))
			status = ' ';
		else
			status = 'L';
		sprintf(tstring,"%s/%s.txt",Mailqdir,line);
		stat(tstring,&stbuf);
		tminfo = localtime(&stbuf.st_ctime);
		fgets(host,sizeof(host),fp);
		rip(host);
		fgets(from,sizeof(from),fp);
		rip(from);
		printf("%c %7s %7ld %02d/%02d %02d:%02d %-20s %s\n      ",
			status, line, stbuf.st_size,
			tminfo->tm_mon+1,
			tminfo->tm_mday,
			tminfo->tm_hour,
			tminfo->tm_min,
			host,from);
		while (fgets(to,sizeof(to),fp) != NULL) {
			rip(to);
			printf("%s ",to);
		}
		printf("\n");
		(void) fclose(fp);
		kwait(NULL);
		filedir(Mailqueue,1,line);
	}
	return 0;
}

/* kill a job in the mqueue */
static int
dosmtpkill(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	char s[SLINELEN];
	char *cp,c;
	sprintf(s,"%s/%s.lck",Mailqdir,argv[1]);
	cp = strrchr(s,'.');
	if (!access(s,0)) {
		Current->ttystate.echo = Current->ttystate.edit = 0;
		c = keywait("Warning, the job is locked by SMTP. Remove (y/n)? ",0);
		Current->ttystate.echo = Current->ttystate.edit = 1;
		if (c != 'y')
			return 0;
		(void) unlink(s);
	}
	strcpy(cp,".wrk");
	if (unlink(s))
		printf("Job id %s not found\n",argv[1]);
	strcpy(cp,".txt");
	(void) unlink(s);
	return 0;
}

/* Set outbound spool scan interval */
static int
dotimer(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	if(argc < 2){
		printf("%lu/%lu\n",
		read_timer(&Smtpcli_t) /1000L,
		dur_timer(&Smtpcli_t)/ 1000L);
		return 0;
	}
	Smtpcli_t.func = (void (*)())smtptick;/* what to call on timeout */
	Smtpcli_t.arg = NULL;		/* dummy value */
	set_timer(&Smtpcli_t,atol(argv[1])*1000L);	/* set timer duration */
	start_timer(&Smtpcli_t);		/* and fire it up */
	return 0;
}

static int
smtpkick(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	int32 addr = 0;
	if(argc > 1 && (addr = resolve(argv[1])) == 0){
		printf(Badhost,argv[1]);
		return 1;
	}
	smtptick(addr);
	return 0;
}

/* This is the routine that gets called every so often to do outgoing
 * mail processing. When called with a null argument, it runs the entire
 * queue; if called with a specific non-zero IP address from the remote
 * kick server, it only starts up sessions to that address.
 */
int
smtptick(target)
int32 target;
{
	register struct smtpcli *cb;
	struct smtp_job *jp;
	struct list *ap;
	char	tmpstring[LINELEN], wfilename[13], prefix[9];
	char	from[LINELEN], to[LINELEN];
	char *cp, *cp1;
	int32 destaddr;
	FILE *wfile;

#ifdef SMTPTRACE
	if (Smtptrace > 5)
		printf("smtp daemon entered, target = %s\n",inet_ntoa(target));
#endif
	if(availmem() != 0){
		/* Memory is tight, don't do anything */
		/* Restart timer */
		start_timer(&Smtpcli_t);
		return 0;
	}
	for(filedir(Mailqueue,0,wfilename);wfilename[0] != '\0';
		filedir(Mailqueue,1,wfilename)){

		/* save the prefix of the file name which it job id */
		cp = wfilename;
		cp1 = prefix;
		while (*cp && *cp != '.')
			*cp1++ = *cp++;
		*cp1 = '\0';

		/* lock this file from the smtp daemon */
		if (mlock(Mailqdir,prefix))
			continue;

		sprintf(tmpstring,"%s/%s",Mailqdir,wfilename);
		if ((wfile = fopen(tmpstring,READ_TEXT)) == NULL) {
			/* probably too many open files */
			(void) rmlock(Mailqdir,prefix);
			/* continue to next message. The failure
			* may be temporary */
			continue;
		}

		(void) fgets(tmpstring,LINELEN,wfile);	/* read target host */
		rip(tmpstring);

		if ((destaddr = mailroute(tmpstring)) == 0) {
			fclose(wfile);
			printf("** smtp: Unknown address %s\n",tmpstring);
			(void) rmlock(Mailqdir,prefix);
			continue;
		}
		if(target != 0 && destaddr != target){
			fclose(wfile);
			(void) rmlock(Mailqdir,prefix);
			continue;	/* Not the proper target of a kick */
		}
		if ((cb = lookup(destaddr)) == NULL) {
			/* there are enough processes running already */
			if (Smtpsessions >= Smtpmaxcli) {
#ifdef SMTPTRACE
				if (Smtptrace) {
					printf("smtp daemon: too many processes\n");
				}
#endif
				fclose(wfile);
				(void) rmlock(Mailqdir,prefix);
				break;
			}
			if ((cb = newcb()) == NULL) {
				fclose(wfile);
				(void) rmlock(Mailqdir,prefix);
				break;
			} 
			cb->ipdest = destaddr;
			cb->destname = strdup(tmpstring);
		} else {
			if(cb->lock){
				/* This system is already is sending mail lets not
				* interfere with its send queue.
				*/
				fclose(wfile);
				(void) rmlock(Mailqdir,prefix);
				continue;
			}
		}

		(void) fgets(from,LINELEN,wfile);	/* read from */
		rip(from);
		if ((jp = setupjob(cb,prefix,from)) == NULL) {
			fclose(wfile);
			(void) rmlock(Mailqdir,prefix);
			del_session(cb);
			break;
		}
		while (fgets(to,LINELEN,wfile) != NULL) {
			rip(to);
			if (addlist(&jp->to,to,DOMAIN) == NULL) {
				fclose(wfile);
				del_session(cb);
			}
		}
		fclose(wfile);
#ifdef SMTPTRACE
		if (Smtptrace > 1) {
			printf("queue job %s From: %s To:",prefix,from);
			for (ap = jp->to; ap != NULL; ap = ap->next)
				printf(" %s",ap->val);
			printf("\n");
		}
#endif
	}

	/* start sending that mail */
	execjobs();

	/* Restart timer */
	start_timer(&Smtpcli_t);
	return 0;
}

/* This is the master state machine that handles a single SMTP transaction.
 * It is called with a queue of jobs for a particular host.
 * The logic is complicated by the "Smtpbatch" variable, which controls
 * the batching of SMTP commands. If Smtpbatch is true, then many of the
 * SMTP commands are sent in one swell foop before waiting for any of
 * the responses. Unfortunately, this breaks many brain-damaged SMTP servers
 * out there, so provisions have to be made to operate SMTP in lock-step mode.
 */
static void
smtp_send(unused,cb1,p)
int unused;
void *cb1;
void *p;
{
	register struct smtpcli *cb;
	register struct list *tp;
	struct sockaddr_in fsocket;
	char *cp;
	int rcode;
	int rcpts;
	int goodrcpt;
	int i,s;
	int init = 1;

	cb = (struct smtpcli *)cb1;
	cb->lock = 1;
	fsocket.sin_family = AF_INET;
	fsocket.sin_addr.s_addr = cb->ipdest;
	fsocket.sin_port = IPPORT_SMTP;

	s = socket(AF_INET,SOCK_STREAM,0);
#ifdef SMTPTRACE
	if (Smtptrace) 
		printf("SMTP client Trying...\n");
#endif
	if(connect(s,(struct sockaddr *)&fsocket,SOCKSIZE) == 0){
		cb->network = fdopen(s,"r+t");
#ifdef SMTPTRACE
		if (Smtptrace) 
			printf("Connected\n");
#endif
	} else {
		cp = sockerr(s);
#ifdef SMTPTRACE
		if (Smtptrace) 
			printf("Connect failed: %s\n",cp != NULL ? cp : "");
#endif
		logmsg(s,"SMTP %s Connect failed: %s",psocket(&fsocket),
		    cp != NULL ? cp : "");
	}
	if(!Smtpbatch){
		rcode = getresp(cb,200);
		if(rcode == -1 || rcode >= 400)
			goto quit;
	}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女同性恋一区二区| 九色porny丨国产精品| 中文字幕在线观看不卡| 久久久91精品国产一区二区精品| 日韩精品一区二区三区中文不卡| 日韩欧美一区在线观看| 欧美一区二区免费视频| 日韩午夜电影av| 欧美成人女星排行榜| 欧美精品一区二区三区在线 | 99视频国产精品| 93久久精品日日躁夜夜躁欧美| 成人18视频在线播放| 99久久99久久精品免费观看 | 欧美精品欧美精品系列| 91麻豆精品国产自产在线观看一区 | 成人免费va视频| 成人精品国产一区二区4080| 99精品视频一区二区三区| 91麻豆国产在线观看| 在线一区二区三区四区| 69堂亚洲精品首页| 精品久久久久99| 久久久久久久久97黄色工厂| 中文字幕在线观看一区二区| 亚洲综合一区二区三区| 免费av网站大全久久| 国产原创一区二区三区| 成人精品一区二区三区四区| 欧美性受xxxx| 欧美xxxx在线观看| 国产精品进线69影院| 亚洲国产视频在线| 久久99在线观看| 99在线视频精品| 欧美老女人第四色| 久久精品人人做人人爽97| 亚洲三级在线免费观看| 日本不卡一二三区黄网| 从欧美一区二区三区| 91久久国产最好的精华液| 欧美高清视频不卡网| 久久久久国产精品麻豆| 亚洲精品国产第一综合99久久| 奇米影视一区二区三区| 成人高清伦理免费影院在线观看| 欧美日韩亚洲丝袜制服| 久久婷婷国产综合精品青草| 亚洲色图丝袜美腿| 经典三级在线一区| 欧美亚日韩国产aⅴ精品中极品| 精品毛片乱码1区2区3区| 自拍视频在线观看一区二区| 热久久国产精品| 一本到不卡免费一区二区| 精品国产乱子伦一区| 亚洲精品一卡二卡| 国产一区二区三区免费在线观看| 色综合久久综合网欧美综合网| 日韩一区二区免费高清| 最新国产精品久久精品| 人妖欧美一区二区| 日本久久电影网| 久久人人超碰精品| 午夜a成v人精品| 99久久精品国产导航| 2020国产精品久久精品美国| 一区二区三区免费看视频| 国产精品18久久久久| 欧美情侣在线播放| 亚洲欧美日韩在线| 国产精品一区二区在线播放 | 4438x亚洲最大成人网| 一区在线中文字幕| 国产一区二区三区日韩| 91精品中文字幕一区二区三区| 国产精品国产三级国产aⅴ中文 | 亚洲欧洲在线观看av| 久久超碰97人人做人人爱| 欧美偷拍一区二区| 亚洲日本一区二区| 成人黄色在线网站| 久久久久久久久久久黄色| 美腿丝袜一区二区三区| 欧美日韩国产经典色站一区二区三区 | 国产三级一区二区| 精品一区二区三区在线播放视频 | 亚洲一区二区三区爽爽爽爽爽| 成人精品免费看| 久久久久国产精品人| 久草中文综合在线| 日韩一区二区三区视频在线| 婷婷久久综合九色综合伊人色| 色婷婷综合在线| 亚洲人成网站在线| 成人国产精品视频| 国产欧美一区二区三区在线看蜜臀 | 欧美韩国日本综合| 国产乱人伦偷精品视频免下载| 精品国产免费一区二区三区香蕉 | 欧美亚洲一区二区在线观看| 亚洲欧美激情插| 色婷婷av久久久久久久| 一区二区三区不卡在线观看| 色香蕉久久蜜桃| 亚洲线精品一区二区三区| 欧美日韩五月天| 日韩国产欧美在线视频| 69精品人人人人| 麻豆精品蜜桃视频网站| 精品噜噜噜噜久久久久久久久试看| 美女一区二区三区在线观看| 日韩视频免费直播| 久久精品99久久久| 精品免费国产一区二区三区四区| 国产一区欧美日韩| 国产精品久久毛片av大全日韩| 成人av网站免费| 亚洲综合色噜噜狠狠| 在线播放中文字幕一区| 精品中文字幕一区二区| 欧美国产成人精品| 91丨九色porny丨蝌蚪| 亚洲网友自拍偷拍| 91精品欧美一区二区三区综合在| 老鸭窝一区二区久久精品| 2024国产精品| 99国产精品久久久久久久久久| 亚洲精品视频观看| 欧美一区二区视频在线观看2022 | 91福利社在线观看| 日本亚洲一区二区| 国产欧美日韩激情| 欧洲一区二区av| 久久精品国产99| 亚洲欧洲色图综合| 制服丝袜一区二区三区| 国产在线播放一区| 亚洲欧美国产77777| 欧美一级理论性理论a| 国产精品18久久久久久久久久久久 | 亚洲免费av高清| 91精品综合久久久久久| 粉嫩在线一区二区三区视频| 亚洲免费观看高清完整版在线观看 | 久久综合五月天婷婷伊人| 成人ar影院免费观看视频| 亚洲图片自拍偷拍| 久久香蕉国产线看观看99| 在线国产亚洲欧美| 国产一区二区三区四区五区美女| 亚洲精品成人悠悠色影视| 欧美一区二区三区免费在线看| 丁香六月久久综合狠狠色| 亚洲第一av色| 国产精品久久久久7777按摩 | 五月天国产精品| 国产欧美日韩精品一区| 欧美精品18+| 91麻豆6部合集magnet| 久久99最新地址| 亚洲一二三四在线观看| 欧美国产乱子伦 | 久久久久久久电影| 欧美人动与zoxxxx乱| 成人黄色小视频| 精品一区二区在线观看| 亚洲综合成人在线视频| 国产欧美日本一区视频| 欧美一区午夜视频在线观看| 成人激情文学综合网| 狠狠色狠狠色合久久伊人| 亚洲一卡二卡三卡四卡无卡久久 | 国产精品一二三区| 日韩电影一区二区三区| 日韩一区欧美一区| 欧美精品一区二区三区蜜臀| 欧美另类变人与禽xxxxx| 一本色道综合亚洲| 成人午夜精品在线| 久久99精品久久久久久国产越南 | 欧美一区二区三区色| 色播五月激情综合网| 国产成a人亚洲精| 国精产品一区一区三区mba视频 | 亚洲精品欧美专区| 中文字幕av一区二区三区免费看| 精品国产凹凸成av人导航| 91精品国产综合久久久蜜臀图片 | 欧美一卡二卡三卡| 欧美日韩国产123区| 色综合久久综合网欧美综合网| 波多野结衣在线一区| 国产精品一区二区男女羞羞无遮挡| 国产日韩一级二级三级| 精品91自产拍在线观看一区| 精品国偷自产国产一区| 精品第一国产综合精品aⅴ| 日韩精品专区在线| 欧美一级片免费看|