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

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

?? smtpserv.c

?? TCPIP協議包
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* SMTP Server state machine - see RFC 821
 */
#include <stdio.h>
#include <time.h>
#ifdef UNIX
#include <sys/types.h>
#endif
#if	defined(__STDC__) || defined(__TURBOC__)
#include <stdarg.h>
#endif
#include <ctype.h>
#include <setjmp.h>
#include "global.h"
#include "mbuf.h"
#include "cmdparse.h"
#include "socket.h"
#include "iface.h"
#include "proc.h"
#include "smtp.h"
#include "commands.h"
#include "dirutil.h"
#include "mailbox.h"
#include "bm.h"
#include "domain.h"

char *Days[7] = {  "Sun","Mon","Tue","Wed","Thu","Fri","Sat" };
char *Months[12] = { "Jan","Feb","Mar","Apr","May","Jun",
		"Jul","Aug","Sep","Oct","Nov","Dec" };



static struct list *expandalias(struct list **head,char *user);
static int  getmsgtxt(struct smtpsv *mp);
static struct smtpsv *mail_create(void);
static void mail_clean(struct smtpsv *mp);
static int mailit(FILE *data,char *from,struct list *tolist);
static int router_queue(FILE *data,char *from,struct list *to);
static void smtplog(char *fmt,...);
static void smtpserv(int s,void *unused,void *p);
static int mailuser(FILE *data,char *from,char *to);

/* Command table */
static char *commands[] = {
	"helo",
	"noop",
	"mail from:",
	"quit",
	"rcpt to:",
	"help",
	"data",
	"rset",
	"expn",
	NULL
};
enum smtp_cmd {
	HELO_CMD,
	NOOP_CMD,
	MAIL_CMD,
	QUIT_CMD,
	RCPT_CMD,
	HELP_CMD,
	DATA_CMD,
	RSET_CMD,
	EXPN_CMD
};

/* Reply messages */
static char Help[] = "214-Commands:\n214-HELO NOOP MAIL QUIT RCPT HELP DATA RSET EXPN\n214 End\n";
static char Banner[] = "220 %s SMTP ready\n";
static char Closing[] = "221 Closing\n";
static char Ok[] = "250 Ok\n";
static char Reset[] = "250 Reset state\n";
static char Sent[] = "250 Sent\n";
static char Ourname[] = "250 %s, Share and Enjoy!\n";
static char Enter[] = "354 Enter mail, end with .\n";
static char Ioerr[] = "452 Temp file write error\n";
static char Badcmd[] = "500 Command unrecognized\n";
static char Lowmem[] = "421 System overloaded, try again later\n";
static char Syntax[] = "501 Syntax error\n";
static char Needrcpt[] = "503 Need RCPT (recipient)\n";
static char Unknown[] = "550 <%s> address unknown\n";
static char Noalias[] = "550 No alias for <%s>\n";

static int Ssmtp = -1; /* prototype socket for service */

/* Start up SMTP receiver service */
int
smtp1(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct sockaddr_in lsocket;
	int s;
	FILE *network;

	if(Ssmtp != -1){
		return 0;
	}
	ksignal(Curproc,0);	/* Don't keep the parser waiting */
	chname(Curproc,"SMTP listener");

	lsocket.sin_family = AF_INET;
	lsocket.sin_addr.s_addr = INADDR_ANY;
	if(argc < 2)
		lsocket.sin_port = IPPORT_SMTP;
	else
		lsocket.sin_port = atoi(argv[1]);

	Ssmtp = socket(AF_INET,SOCK_STREAM,0);
	bind(Ssmtp,(struct sockaddr *)&lsocket,sizeof(lsocket));
	listen(Ssmtp,1);
	for(;;){
		if((s = accept(Ssmtp,NULL,(int *)NULL)) == -1)
			break;	/* Service is shutting down */

		network = fdopen(s,"r+t");
		if(availmem() != 0){
			fprintf(network,Lowmem);
			fclose(network);
		} else {
			/* Spawn a server */
			newproc("SMTP server",2048,smtpserv,s,(void *)network,NULL,0);
		}
	}
	return 0;
}

/* Shutdown SMTP service (existing connections are allowed to finish) */
int
smtp0(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	close_s(Ssmtp);
	Ssmtp = -1;
	return 0;
}

static void
smtpserv(s,n,p)
int s;
void *n;
void *p;
{
	struct smtpsv *mp;
	char **cmdp,buf[LINELEN],*arg,*cp,*cmd,*newaddr;
	struct list *ap,*list;
	int cnt;
	char address_type;
	FILE *network;

	network = (FILE *)n;
	sockowner(fileno(network),Curproc);		/* We own it now */
	logmsg(fileno(network),"open SMTP");

	if((mp = mail_create()) == NULL){
		printf(Nospace);
		logmsg(fileno(network),"close SMTP - no space");
		fclose(network);
		return;
	}
	mp->network = network;

	(void) fprintf(network,Banner,Hostname);

loop:	if (fgets(buf,sizeof(buf),network) == NULL) {
		/* He closed on us */
		goto quit;
	}
	cnt = strlen(buf);
	if(cnt < 4){
		/* Can't be a legal command */
		fprintf(network,Badcmd);
		goto loop;
	}	
	rip(buf);
	cmd = buf;

	/* Translate entire buffer to lower case */
	for(cp = cmd;*cp != '\0';cp++)
		*cp = tolower(*cp);

	/* Find command in table; if not present, return syntax error */
	for(cmdp = commands;*cmdp != NULL;cmdp++)
		if(strncmp(*cmdp,cmd,strlen(*cmdp)) == 0)
			break;
	if(*cmdp == NULL){
		(void) fprintf(network,Badcmd);
		goto loop;
	}
	arg = &cmd[strlen(*cmdp)];
	/* Skip spaces after command */
	while(*arg == ' ')
		arg++;
	/* Execute specific command */
	switch(cmdp-commands) {
	case HELO_CMD:
		free(mp->system);
		mp->system = strdup(arg);
		(void) fprintf(network,Ourname,Hostname);
		break;
	case NOOP_CMD:
		(void) fprintf(network,Ok);
		break;
	case MAIL_CMD:
		if((cp = getname(arg)) == NULL){
			(void) fprintf(network,Syntax);
			break;
		}
		free(mp->from);
		mp->from = strdup(cp);
		(void) fprintf(network,Ok);
		break;
	case QUIT_CMD:
		(void) fprintf(network,Closing);
		goto quit;
	case RCPT_CMD:	/* Specify recipient */
		if((cp = getname(arg)) == NULL){
			(void) fprintf(network,Syntax);
			break;
		}

		/* rewrite address if possible */
		if((newaddr = rewrite_address(cp)) != NULL) {
			strcpy(buf,newaddr);
			cp = buf;
			free(newaddr);
		}

		/* check if address is ok */
		if ((address_type = validate_address(cp)) == BADADDR) {
			(void) fprintf(network,Unknown,cp);
			break;
		}
		/* if a local address check for an alias */
		if (address_type == LOCAL)
			expandalias(&mp->to, cp);
		else
			/* a remote address is added to the list */
			addlist(&mp->to, cp, address_type);

		(void) fprintf(network,Ok);
		break;
	case HELP_CMD:
		(void) fprintf(network,Help);
		break;
	case DATA_CMD:
		if(mp->to == NULL)
			(void) fprintf(network,Needrcpt);
		else if ((mp->data = tmpfile()) == NULL)
			(void) fprintf(network,Ioerr);
		 else
			getmsgtxt(mp);
		break;
	case RSET_CMD:
		del_list(mp->to);
		mp->to = NULL;
		(void) fprintf(network,Reset);
		break;
	case EXPN_CMD:
		if (*arg == '\0') {
			(void) fprintf(network,Syntax);
			break;
		}

		list = NULL;
		/* rewrite address if possible */
		if((newaddr = rewrite_address(arg)) != NULL)
			if(strcmp(newaddr,arg) == 0) {
				free(newaddr);
				newaddr = NULL;
			}
			else {
				strcpy(buf,newaddr);
				arg = buf;
			}
		list = NULL;
		expandalias(&list,arg);
		if (strcmp(list->val,arg) == 0 && list->next == NULL)
			if(newaddr == NULL) {
				(void) fprintf(network,Noalias,arg);
				del_list(list);
				break;
			}
		ap = list;
		while (ap->next != NULL) {
			(void) fprintf(network,"250-%s\n",ap->val);
			ap = ap->next;
		}
		fprintf(network,"250 %s\n",ap->val);
		del_list(list);
		free(newaddr);
		break;
	}
	goto loop;

quit:
	logmsg(fileno(network),"close SMTP");
	fclose(network);
	mail_clean(mp);
	smtptick(0L);			/* start SMTP daemon immediately */
}

/* read the message text */
static int
getmsgtxt(mp)
struct smtpsv *mp;
{
	char buf[LINELEN];
	register char *p = buf;
	long t;
	FILE *network;
	FILE *data;
	char *cp;

	network = mp->network;
	data = mp->data;
	/* Add timestamp; ptime adds newline */
	time(&t);
	fprintf(data,"Received: ");
	if(mp->system != NULL)
		fprintf(data,"from %s ",mp->system);
	fprintf(data,"by %s with SMTP\n\tid AA%ld ; %s",
			Hostname, get_msgid(), ptime(&t));
	if(ferror(data)){
		(void) fprintf(network,Ioerr);
		return 1;
	} else {
		(void) fprintf(network,Enter);
	}
	while(1) {
		if(fgets(p,sizeof(buf),network) == NULL){
			return 1;
		}
		rip(p);
		/* check for end of message ie a . or escaped .. */
		if (*p == '.') {
			if (*++p == '\0') {
				/* Also sends appropriate response */
				if (mailit(data,mp->from,mp->to) != 0)
					(void) fprintf(network,Ioerr);
				else
					(void) fprintf(network,Sent);
				fclose(data);
				data = NULL;
				del_list(mp->to);
				mp->to = NULL;
				return 0;
			} else if (!(*p == '.' && *(p+1) == '\0'))
				p--;
		}
#ifdef	MSDOS
		while((cp = strchr(p,CTLZ)) != NULL)
			*cp = '\n';
#endif
		/* for UNIX mail compatiblity */
		if (strncmp(p,"From ",5) == 0)
			(void) putc('>',data);
		/* Append to data file */
		if(fprintf(data,"%s\n",p) < 0) {
			(void) fprintf(network,Ioerr);
			return 1;
		}
	}
	return 0;
}

/* Create control block, initialize */
static struct smtpsv *
mail_create()
{
	register struct smtpsv *mp;

	mp = (struct smtpsv *)callocw(1,sizeof(struct smtpsv));
	mp->from = strdup("");	/* Default to null From address */
	return mp;
}

/* Free resources, delete control block */
static void
mail_clean(mp)
register struct smtpsv *mp;
{
	if (mp == NULL)
		return;
	free(mp->system);
	free(mp->from);
	if(mp->data != NULL)
		fclose(mp->data);
	del_list(mp->to);
	free(mp);
}


/* Given a string of the form <user@host>, extract the part inside the
 * brackets and return a pointer to it.
 */
char *
getname(cp)
register char *cp;
{
	register char *cp1;

	if ((cp = strchr(cp,'<')) == NULL)
		return NULL;
	cp++;	/* cp -> first char of name */
	if ((cp1 = strchr(cp,'>')) == NULL)
		return NULL;
	*cp1 = '\0';
	return cp;
}

		
/* General mailit function. It takes a list of addresses which have already
** been verified and expanded for aliases. Base on the current mode the message
** is place in an mbox, the outbound smtp queue or the rqueue interface
*/
static int
mailit(data,from,tolist)
FILE *data;
char *from;
struct list *tolist;
{
	struct list *ap, *dlist = NULL;
	register FILE *fp;
	char	mailbox[50], *cp, *host, *qhost;
	int	c, fail = 0;
	time_t	t;

	if ((Smtpmode & QUEUE) != 0)
		return(router_queue(data,from,tolist));

	do {
		qhost = NULL;
		for(ap = tolist;ap != NULL;ap = ap->next)
			if (ap->type == DOMAIN) {
				if ((host = strrchr(ap->val,'@')) != NULL)
					host++;
				else
					host = Hostname;
				if(qhost == NULL)
			     		qhost = host;
				if(stricmp(qhost,host) == 0) {
					ap->type = BADADDR;
					addlist(&dlist,ap->val,0);
				}
			}
		if(qhost != NULL) {
			rewind(data);
			queuejob(data,qhost,dlist,from);
			del_list(dlist);
			dlist = NULL;
		}
	} while(qhost != NULL);

	for(ap = tolist;ap != NULL;ap = ap->next) {
		if(ap->type != LOCAL) {
			ap->type = DOMAIN;
			continue;
		}
		rewind(data);
		/* strip off host name of LOCAL addresses */
		if ((cp = strchr(ap->val,'@')) != NULL)
			*cp = '\0';

		/* truncate long user names */
		if (strlen(ap->val) > MBOXLEN)
			ap->val[MBOXLEN] = '\0';

		/* if mail file is busy save it in our smtp queue
		 * and let the smtp daemon try later.
		 */
		if (mlock(Mailspool,ap->val)) {
			addlist(&dlist,ap->val,0);
			fail = queuejob(data,Hostname,dlist,from);
			del_list(dlist);
			dlist = NULL;
		}
		else {
			char buf[LINELEN];
			int tocnt = 0;
			sprintf(mailbox,"%s/%s.txt",Mailspool,ap->val);
#ifndef	AMIGA
			if((fp = fopen(mailbox,APPEND_TEXT)) != NULL) {
#else
			if((fp = fopen(mailbox,"r+")) != NULL) {
				(void) fseek(fp, 0L, 2);
#endif
				time(&t);
				fprintf(fp,"From %s %s",from,ctime(&t));
				host = NULL;
				while(fgets(buf,sizeof(buf),data) != NULL){
					if(buf[0] == '\n'){
						if(tocnt == 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区免费观看| 亚洲精品写真福利| 青娱乐精品视频| 欧美精品乱码久久久久久按摩| 成人免费视频免费观看| 91精品国产免费久久综合| 日韩av网站在线观看| 精品精品国产高清一毛片一天堂| 久久99在线观看| 中文字幕成人网| 色中色一区二区| 日日夜夜一区二区| 欧美精品一区二区三区蜜桃视频| 国产精品99久久久久久宅男| 亚洲色图视频网| 欧美日韩亚洲不卡| 韩日av一区二区| 亚洲欧美色一区| 欧美二区三区的天堂| 国产精品一区专区| 一区二区欧美国产| 日韩写真欧美这视频| 成人性色生活片免费看爆迷你毛片| 亚洲欧洲精品一区二区精品久久久| 91麻豆.com| 麻豆精品一区二区综合av| 国产精品网站在线观看| 欧美日韩免费电影| 粉嫩绯色av一区二区在线观看| 一区二区三区在线看| 精品精品欲导航| 91国产视频在线观看| 国产尤物一区二区| 一区二区三区欧美在线观看| 精品久久久久香蕉网| 色噜噜狠狠成人网p站| 精品亚洲porn| 亚洲午夜久久久久久久久久久 | 久久久精品综合| 在线观看网站黄不卡| 国产精品888| 偷偷要91色婷婷| 国产精品夫妻自拍| 久久日韩精品一区二区五区| 欧美日韩国产bt| 91影视在线播放| 国产九色sp调教91| 另类小说图片综合网| 一区二区三区在线影院| 国产精品私人影院| 精品国产一区二区精华| 欧美日韩亚洲综合一区二区三区| 亚洲欧美激情小说另类| caoporn国产精品| 久久99久久久久| 亚洲国产sm捆绑调教视频 | 成人一级片网址| 蜜臀av一区二区| 亚洲123区在线观看| 亚洲乱码国产乱码精品精可以看 | www.欧美日韩| 国产成人av电影在线观看| 麻豆视频观看网址久久| 日精品一区二区| 亚洲一级二级三级在线免费观看| 国产精品乱码一区二三区小蝌蚪| 欧美精品一区二区三区蜜桃| 日韩欧美国产综合一区| 在线播放国产精品二区一二区四区| 色呦呦一区二区三区| 99视频一区二区三区| 成人免费视频app| 国产精一品亚洲二区在线视频| 美女视频黄免费的久久 | 欧美一级在线观看| 欧美日韩国产欧美日美国产精品| 色哟哟一区二区在线观看| 91在线观看一区二区| 不卡视频一二三| 不卡av在线免费观看| 99精品热视频| 一本到不卡精品视频在线观看| av电影在线观看一区| 91原创在线视频| 色视频欧美一区二区三区| 在线亚洲欧美专区二区| 欧美午夜不卡视频| 91精品国产综合久久香蕉的特点 | 午夜欧美一区二区三区在线播放| 亚洲国产一区二区在线播放| 偷拍一区二区三区四区| 日本女人一区二区三区| 韩国理伦片一区二区三区在线播放| 韩国av一区二区三区在线观看| 国产一区二区福利视频| 成人av集中营| 欧美日韩一区二区三区免费看| 欧美另类videos死尸| 精品久久久久av影院| 欧美国产成人精品| 亚洲老司机在线| 免费观看91视频大全| 亚洲线精品一区二区三区八戒| 精品sm捆绑视频| 一区在线中文字幕| 一区二区欧美国产| 久久精品国产免费| www.亚洲激情.com| 欧美日韩一区小说| 久久久久久影视| 亚洲精品精品亚洲| 韩国在线一区二区| 91福利视频久久久久| 欧美tickle裸体挠脚心vk| 国产精品久久久久天堂| 午夜欧美电影在线观看| 成人午夜伦理影院| 宅男噜噜噜66一区二区66| 国产欧美日韩中文久久| 亚洲成年人影院| 国产99精品在线观看| 制服丝袜av成人在线看| 中文字幕国产精品一区二区| 亚洲成人免费视频| 成人晚上爱看视频| 欧美一区二区成人6969| 亚洲视频一区在线| 国产一区二区久久| 欧美丰满少妇xxxxx高潮对白 | 日韩精品亚洲专区| 北条麻妃一区二区三区| 日韩女优制服丝袜电影| 亚洲一区二区三区中文字幕 | 麻豆精品一区二区三区| 91久久精品一区二区三| 久久九九99视频| 天天做天天摸天天爽国产一区| 成人福利视频在线看| 日韩欧美一级二级三级久久久| 亚洲精品日产精品乱码不卡| 国产成人自拍高清视频在线免费播放| 色av成人天堂桃色av| 国产女主播一区| 精品一区二区三区免费视频| 欧美日韩免费在线视频| 亚洲天堂av一区| 国产成人av电影在线观看| 亚洲精品一区在线观看| 日韩影视精彩在线| 欧美日韩在线免费视频| 亚洲视频在线一区观看| 性做久久久久久免费观看| 日韩不卡在线观看日韩不卡视频| 一本久久精品一区二区| 中文字幕一区二区视频| 国产91精品久久久久久久网曝门 | 欧美zozozo| 免费久久99精品国产| 欧美精品第一页| 性久久久久久久久久久久| 欧美最新大片在线看| 亚洲欧洲制服丝袜| 一本色道久久综合精品竹菊| 中文字幕中文字幕一区二区| 成人网男人的天堂| 国产精品理论在线观看| 波多野结衣在线aⅴ中文字幕不卡| 久久新电视剧免费观看| 国产一区二区三区四区在线观看| 欧美tickling网站挠脚心| 久久国产生活片100| 精品电影一区二区| 国产激情精品久久久第一区二区| 久久久久久9999| 不卡区在线中文字幕| 专区另类欧美日韩| 在线区一区二视频| 丝袜a∨在线一区二区三区不卡| 精品视频在线看| 日韩精品视频网| 日韩限制级电影在线观看| 久久97超碰国产精品超碰| 久久久久久日产精品| 成人一区二区三区| 亚洲精品高清视频在线观看| 欧美写真视频网站| 免费观看久久久4p| xvideos.蜜桃一区二区| 成人一级黄色片| 一区二区高清在线| 欧美一区午夜视频在线观看| 国内成人自拍视频| 91麻豆免费观看| 欧美国产激情二区三区| 色综合天天综合给合国产| 亚洲va欧美va天堂v国产综合| 日韩欧美高清dvd碟片| 成人手机电影网| 有坂深雪av一区二区精品| 日韩欧美国产一区二区三区|