亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产中文字幕一区| 在线精品亚洲一区二区不卡| 成人美女视频在线观看| 欧美在线啊v一区| 国产精品网站在线播放| 五月天中文字幕一区二区| av在线播放不卡| 欧美电影免费观看高清完整版在线 | 国产在线视频一区二区| 日本国产一区二区| 国产精品日日摸夜夜摸av| 久久草av在线| 欧美久久久影院| 亚洲国产精品影院| 91视频国产观看| 日韩一区在线免费观看| 成人深夜在线观看| 久久久久久**毛片大全| 麻豆国产一区二区| 91精品国产黑色紧身裤美女| 亚洲午夜影视影院在线观看| 色综合中文综合网| 国产日产亚洲精品系列| 久久黄色级2电影| 欧美xingq一区二区| 男人的天堂久久精品| 欧美日韩国产首页在线观看| 亚洲宅男天堂在线观看无病毒| 99re这里只有精品6| 中文字幕一区二区三区在线播放| 高清在线不卡av| 欧美国产乱子伦 | 美女一区二区在线观看| 91精品国产全国免费观看| 日韩专区在线视频| 欧美精品v日韩精品v韩国精品v| 亚洲自拍偷拍av| 欧美日免费三级在线| 亚洲va中文字幕| 91精品国产综合久久精品 | 91精品在线免费| 男女男精品视频| 久久久久综合网| 成人免费视频app| 亚洲人成精品久久久久久| 91久久久免费一区二区| 五月婷婷激情综合网| 91精品国产一区二区人妖| 精品一二线国产| 日本一区二区成人在线| 日本久久一区二区| 日韩精品亚洲一区二区三区免费| 欧美精三区欧美精三区| 久久99这里只有精品| 欧美激情一区二区三区四区| 色哟哟精品一区| 麻豆国产欧美日韩综合精品二区| 国产亚洲欧美日韩在线一区| 成人丝袜18视频在线观看| 亚洲综合精品自拍| 精品欧美一区二区在线观看| 99视频一区二区| 日本伊人色综合网| 国产精品美女久久久久久久| 欧美色综合久久| 国产专区综合网| 一区二区三区在线视频观看58| 欧美美女喷水视频| 成人黄色大片在线观看| 偷拍亚洲欧洲综合| 国产色爱av资源综合区| 欧美三级欧美一级| 成人毛片在线观看| 日本欧美一区二区| 亚洲精品少妇30p| 欧美电视剧免费全集观看| 一本大道av伊人久久综合| 久久精品国产秦先生| 一区二区三区资源| 久久人人97超碰com| 欧美日韩在线播| 成人av网址在线| 激情丁香综合五月| 丝袜亚洲精品中文字幕一区| 中文字幕va一区二区三区| 日韩欧美美女一区二区三区| 在线视频一区二区三区| 成人一区二区视频| 韩国成人在线视频| 日韩精品五月天| 亚洲欧美色一区| 久久久不卡网国产精品二区| 日韩一区二区三区在线观看| 一本到不卡免费一区二区| 粉嫩久久99精品久久久久久夜| 日韩黄色免费网站| 亚洲影院免费观看| 中文字幕一区二| 国产精品久久精品日日| 久久综合九色欧美综合狠狠| 欧美精品18+| 欧美色手机在线观看| 在线国产亚洲欧美| 91麻豆精品视频| caoporm超碰国产精品| 国产成人午夜99999| 国产一区999| 国产一区 二区| 国产乱码精品一品二品| 韩国精品主播一区二区在线观看| 免费欧美日韩国产三级电影| 亚洲国产日日夜夜| 亚洲bt欧美bt精品777| 一区二区在线观看视频 | 日本一区二区三区在线不卡| 激情文学综合丁香| 丝袜亚洲另类丝袜在线| 五月婷婷欧美视频| 日韩精品三区四区| 日本麻豆一区二区三区视频| 日本麻豆一区二区三区视频| 日韩成人一区二区三区在线观看| 丝袜美腿高跟呻吟高潮一区| 午夜激情综合网| 美女网站视频久久| 激情五月婷婷综合| 成人av在线资源| 色狠狠桃花综合| 欧美精品久久天天躁| 91精品国产免费久久综合| 亚洲精品在线观看网站| 久久美女艺术照精彩视频福利播放| 26uuu亚洲| 国产精品乱码人人做人人爱| 樱桃视频在线观看一区| 日韩国产精品大片| 国产一区二区精品久久91| 国产成人精品免费| 色综合久久99| 91精品国产综合久久精品图片| 日韩欧美国产综合在线一区二区三区 | 亚洲va韩国va欧美va精品| 麻豆精品在线看| 国产成人免费视频网站| 色婷婷av一区二区三区之一色屋| 欧美欧美欧美欧美首页| www国产成人| 一区二区三区.www| 国产真实精品久久二三区| 97精品视频在线观看自产线路二| 欧美日本高清视频在线观看| 精品福利一二区| 亚洲乱码日产精品bd| 精品一区免费av| 色噜噜久久综合| 2022国产精品视频| 亚洲韩国一区二区三区| 国产丶欧美丶日本不卡视频| 欧美图区在线视频| 欧美国产欧美亚州国产日韩mv天天看完整| 一区二区三区成人在线视频| 国产乱码精品一区二区三区av| 欧美亚洲综合久久| 国产清纯白嫩初高生在线观看91 | 国产伦精品一区二区三区视频青涩 | 欧美一卡二卡三卡| 亚洲欧洲日韩一区二区三区| 秋霞影院一区二区| 色婷婷av一区二区三区大白胸 | 国内外精品视频| 欧美卡1卡2卡| 亚洲美女偷拍久久| 高清在线观看日韩| 精品国产乱码久久久久久浪潮| 亚洲午夜在线电影| 99精品在线免费| 国产精品网站在线播放| 韩国av一区二区三区| 91麻豆精品国产91久久久久| 一区二区免费看| 91丨九色丨黑人外教| 国产午夜亚洲精品羞羞网站| 免费av网站大全久久| 欧美日韩不卡在线| 亚洲一区二区三区免费视频| 成人av资源站| 国产精品乱码一区二区三区软件 | 亚洲在线视频一区| 色香色香欲天天天影视综合网| 久久久久久黄色| 经典三级视频一区| 精品国产乱码久久久久久蜜臀| 日韩主播视频在线| 欧美精品电影在线播放| 亚洲成人一区在线| 欧美老肥妇做.爰bbww| 天天影视涩香欲综合网| 欧美日本免费一区二区三区| 亚洲123区在线观看| 欧美精品1区2区|