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

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

?? smtpcli.c

?? TCPIP協議包
?? C
?? 第 1 頁 / 共 2 頁
字號:

#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;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩电影在线| 波多野结衣精品在线| 国产精品美女久久久久aⅴ国产馆| 欧美xxxx在线观看| 2023国产一二三区日本精品2022| 欧美成人精品3d动漫h| 欧美精品一区二区三区蜜桃视频| 久久综合一区二区| 欧美国产精品专区| 1区2区3区国产精品| 亚洲黄色在线视频| 婷婷久久综合九色综合绿巨人| 亚洲国产一二三| 久久99热这里只有精品| 国产美女一区二区| 91免费在线看| 欧美日韩不卡一区| 久久综合久久综合久久| 国产精品久久久99| 亚洲一区二区在线免费看| 亚洲va欧美va人人爽| 久久 天天综合| 91视频一区二区三区| 69精品人人人人| 欧美激情在线观看视频免费| 一色桃子久久精品亚洲| 婷婷久久综合九色综合伊人色| 黑人巨大精品欧美黑白配亚洲| 高清不卡在线观看| 欧美日韩精品福利| 国产欧美1区2区3区| 亚洲一区在线视频观看| 美女国产一区二区| 色琪琪一区二区三区亚洲区| 日韩无一区二区| 亚洲欧美一区二区不卡| 麻豆一区二区三区| 色94色欧美sute亚洲线路一久 | 欧美精品一区视频| 亚洲欧美电影院| 国产一区二区三区在线观看免费| 一本色道a无线码一区v| 久久香蕉国产线看观看99| 亚洲一级二级三级| 高清国产午夜精品久久久久久| 欧美精品久久99| 亚洲精品亚洲人成人网在线播放| 狠狠色狠狠色综合日日91app| 在线视频综合导航| 欧美激情一区在线| 极品美女销魂一区二区三区免费| 色吧成人激情小说| 中文字幕在线不卡国产视频| 国产乱码一区二区三区| 3d动漫精品啪啪一区二区竹菊 | 国产主播一区二区| 欧美久久一二三四区| 亚洲人成在线播放网站岛国| 国产一区二区调教| 精品国产一区二区亚洲人成毛片 | www.视频一区| 国产亚洲精品久| 极品少妇一区二区三区精品视频| 欧美精品一二三| 亚洲成a人片在线不卡一二三区| 91老师国产黑色丝袜在线| 国产精品色一区二区三区| 狠狠色丁香久久婷婷综合_中| 7777精品伊人久久久大香线蕉的| 亚洲国产一区在线观看| 欧美无人高清视频在线观看| 亚洲视频一区二区免费在线观看| 成人午夜看片网址| 中文字幕一区二区三区四区| 成人av影院在线| 亚洲色图色小说| 91丨porny丨在线| 亚洲综合久久久| 欧美在线色视频| 日产国产高清一区二区三区| 91精品国产综合久久久久久久| 日日欢夜夜爽一区| 精品99一区二区三区| 国产一区二区三区高清播放| 国产日产欧产精品推荐色| 国产成人夜色高潮福利影视| 国产精品美女久久久久久久网站| 99re热这里只有精品视频| 亚洲欧美日韩久久精品| 在线观看亚洲专区| 人人精品人人爱| 久久久另类综合| www.av精品| 午夜亚洲国产au精品一区二区| 3d动漫精品啪啪| 国产黑丝在线一区二区三区| 自拍偷拍亚洲激情| 在线不卡中文字幕播放| 国产精品一二二区| 亚洲日本va在线观看| 欧美日本不卡视频| 国产一区二区不卡| 一区av在线播放| 久久免费视频色| 欧美综合在线视频| 国产成人av在线影院| 亚洲综合激情小说| 久久久蜜臀国产一区二区| 欧洲国内综合视频| 国产一区二区三区最好精华液 | 欧美一区二区精美| 成人自拍视频在线| 性做久久久久久久久| 国产三级精品视频| 在线不卡中文字幕播放| 99久久精品国产观看| 精品一区二区三区视频| 一区二区视频在线| 久久久久一区二区三区四区| 欧美在线视频你懂得| 成人自拍视频在线| 国产在线视频不卡二| 一卡二卡三卡日韩欧美| 国产精品久久久久永久免费观看| 欧美电影在哪看比较好| 91久久精品一区二区二区| 国产黄色成人av| 久久精品国产秦先生| 亚洲婷婷国产精品电影人久久| 久久色视频免费观看| 欧美三级视频在线观看| av成人免费在线| 成人午夜在线视频| 国产成人在线色| 韩国v欧美v日本v亚洲v| 日韩国产精品久久| 亚洲va欧美va人人爽午夜| 亚洲免费av高清| 亚洲欧洲美洲综合色网| 中文乱码免费一区二区| 国产亚洲短视频| 久久久久久久久久久久久夜| 欧美大片拔萝卜| 日韩亚洲欧美在线| 日韩欧美一卡二卡| 日韩免费高清电影| 精品久久一二三区| 精品成人一区二区三区四区| 日韩欧美自拍偷拍| 精品免费一区二区三区| 欧美精品一区二区三区蜜桃 | 免费精品99久久国产综合精品| 午夜精品免费在线| 婷婷亚洲久悠悠色悠在线播放| 亚洲午夜在线视频| 亚洲国产日韩精品| 日本亚洲天堂网| 激情偷乱视频一区二区三区| 国产美女av一区二区三区| 国产高清视频一区| 99视频在线精品| 色综合中文字幕国产| 欧美最猛黑人xxxxx猛交| 欧美日韩国产成人在线免费| 欧美一区二区三区的| 亚洲精品一区二区三区四区高清| 国产视频一区在线播放| 国产精品久久久久久亚洲伦| 亚洲日本青草视频在线怡红院 | 国产91高潮流白浆在线麻豆| 国产成人精品www牛牛影视| 99re成人精品视频| 欧美少妇bbb| 亚洲精品在线三区| 国产精品免费久久| 亚洲国产视频直播| 激情偷乱视频一区二区三区| 成人久久视频在线观看| 在线影视一区二区三区| 精品国产sm最大网站免费看| 中文字幕高清不卡| 三级精品在线观看| 懂色av噜噜一区二区三区av| 欧洲色大大久久| 日韩精品中文字幕在线一区| 国产精品久久久久久福利一牛影视| 亚洲午夜精品一区二区三区他趣| 韩国v欧美v日本v亚洲v| 欧美性三三影院| 欧美激情艳妇裸体舞| 日韩影视精彩在线| 91小视频免费看| 精品国产伦理网| 天天综合天天综合色| 大胆亚洲人体视频| 日韩精品最新网址| 亚洲成av人片www| 不卡欧美aaaaa| 久久久久久久久久久久久久久99| 亚洲午夜精品网|