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

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

?? smtpcli.c

?? 很好的TCP_IP協議源代碼分析,很適用很好
?? 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一区二区三区免费野_久草精品视频
国产精品亚洲视频| 亚洲人123区| 中文字幕av不卡| 亚洲精品国久久99热| 天天色综合天天| 国产资源精品在线观看| 99久久精品免费精品国产| 在线亚洲免费视频| 精品国产一区二区国模嫣然| 国产精品无码永久免费888| 亚洲国产精品嫩草影院| 久久国产精品露脸对白| av影院午夜一区| 欧美一区二区三区视频免费播放| 久久亚洲捆绑美女| 亚洲狠狠丁香婷婷综合久久久| 日本一不卡视频| 白白色 亚洲乱淫| 7777精品伊人久久久大香线蕉完整版| 久久久久久日产精品| 亚洲伦在线观看| 精品一区免费av| 色综合色狠狠天天综合色| 日韩一区二区三区三四区视频在线观看| 久久综合成人精品亚洲另类欧美| 亚洲视频一区在线| 国产精品原创巨作av| 欧美亚洲愉拍一区二区| 国产三级一区二区| 日韩电影在线看| 91色porny在线视频| 精品国内片67194| 亚洲综合精品自拍| 粉嫩久久99精品久久久久久夜| 欧美美女黄视频| 亚洲欧美日韩国产手机在线 | av电影在线不卡| 日韩欧美一卡二卡| 一二三区精品视频| 国产91精品露脸国语对白| 日韩精品一区二区三区视频| 一区二区三区成人在线视频| 成人福利视频在线| 26uuu久久天堂性欧美| 午夜免费久久看| 日本道精品一区二区三区| 国产精品理论在线观看| 国内一区二区视频| 91麻豆精品久久久久蜜臀| 亚洲摸摸操操av| 不卡视频在线观看| 国产亚洲制服色| 国内精品在线播放| 日韩写真欧美这视频| 午夜电影网一区| 欧美午夜精品一区| 亚洲一区二区三区四区在线免费观看 | 91视频国产资源| 日韩美女视频19| 成人性生交大合| 国产农村妇女毛片精品久久麻豆| 久久精品久久久精品美女| 欧美一级片在线看| 日日夜夜免费精品视频| 欧美日韩国产小视频| 一区二区三区在线看| 色婷婷国产精品久久包臀| 亚洲欧美日韩人成在线播放| jlzzjlzz欧美大全| 国产精品久久久久久久久免费丝袜 | 欧美日韩mp4| 亚洲大片免费看| 5858s免费视频成人| 男人的天堂久久精品| 制服丝袜在线91| 奇米精品一区二区三区在线观看一| 欧美人伦禁忌dvd放荡欲情| 午夜精品福利一区二区三区蜜桃| 欧美性猛交xxxx乱大交退制版 | 亚洲成在线观看| 欧美高清www午色夜在线视频| 天天亚洲美女在线视频| 欧美肥妇free| 美女国产一区二区| 日韩欧美视频在线| 国产精品资源网| 国产欧美精品区一区二区三区| 成人免费的视频| 国产精品久久久久7777按摩| 91视频在线观看免费| 亚洲精品高清在线| 欧美美女bb生活片| 日韩精品福利网| 久久综合中文字幕| 国产酒店精品激情| 中文字幕一区二区视频| 91蜜桃视频在线| 视频一区欧美日韩| 日韩视频在线观看一区二区| 国产精品一级黄| 国产精品丝袜91| 在线观看日韩电影| 午夜精品久久久久久久蜜桃app| 日韩欧美精品三级| 国产精品自拍网站| 亚洲伦理在线精品| 欧美乱妇15p| 国产精品一级在线| 亚洲日本乱码在线观看| 678五月天丁香亚洲综合网| 美女视频网站黄色亚洲| 国产精品嫩草影院av蜜臀| 95精品视频在线| 麻豆精品一区二区三区| 欧美国产日韩在线观看| 欧美情侣在线播放| 狠狠色综合播放一区二区| 亚洲欧美一区二区三区国产精品 | 久久综合九色综合久久久精品综合| 福利视频网站一区二区三区| 一区二区三区视频在线观看| 欧美一区二区三区色| 成人午夜免费视频| 亚洲国产精品久久人人爱蜜臀| 2024国产精品视频| 日本精品视频一区二区| 麻豆精品一二三| 亚洲人亚洲人成电影网站色| 日韩一级二级三级| 国产suv一区二区三区88区| 亚洲一卡二卡三卡四卡五卡| 欧美电影免费观看高清完整版在| 色综合视频在线观看| 蜜臀久久99精品久久久画质超高清| 亚洲欧洲三级电影| 91麻豆精品国产综合久久久久久| 99re热这里只有精品视频| 免费久久精品视频| 亚洲图片自拍偷拍| 欧美va在线播放| 欧美日韩aaa| 国产成人免费视频一区| 亚洲成人你懂的| 亚洲视频图片小说| 欧美成人a在线| 欧美妇女性影城| av中文字幕在线不卡| 国产在线一区二区| 亚洲一区二区精品3399| 国产精品久久久久aaaa樱花| 日韩一区二区三区免费看 | 视频在线观看91| 亚洲精品免费在线观看| 欧美亚洲另类激情小说| 成人av电影在线网| 日日夜夜一区二区| 无码av免费一区二区三区试看| 久久久久久久网| 久久综合中文字幕| 日韩精品一区在线| 欧美高清视频www夜色资源网| 色婷婷av一区| av在线一区二区| 成人av一区二区三区| 精品一区二区国语对白| 男女激情视频一区| 亚洲小少妇裸体bbw| 一区二区三区产品免费精品久久75| 久久久五月婷婷| 久久久久久久久久久久久夜| 欧美日韩一级二级三级| 欧美午夜片在线观看| 91国偷自产一区二区三区观看| 成人午夜在线视频| 成人精品在线视频观看| 国产麻豆欧美日韩一区| 国产乱一区二区| 麻豆精品在线视频| 精品一区二区综合| 日韩1区2区日韩1区2区| 日韩成人免费电影| 日韩综合一区二区| 日韩av在线发布| 麻豆精品久久精品色综合| 日本在线不卡一区| 美女精品自拍一二三四| 奇米色777欧美一区二区| 麻豆成人免费电影| 久久99这里只有精品| 美女视频网站黄色亚洲| 亚洲18色成人| 久久精品国产色蜜蜜麻豆| 国产一区二区视频在线| 国产一区二区三区日韩| 成人免费毛片片v| 成人高清在线视频| 在线看日本不卡| 欧美系列在线观看| 日韩精品一区二区三区老鸭窝| 久久久久国产精品人|