⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "common.h"#include "send.h"Biobuf	bin;int rmail, tflg;char *subjectarg;char *findbody(char*);voidusage(void){	fprint(2, "usage: upas/filter [-bh] rcvr mailbox [regexp file] ...\n");	exits("usage");}voidmain(int argc, char *argv[]){	message *mp;	dest *dp;	Reprog *p;	Resub match[10];	char file[MAXPATHLEN];	Biobuf *fp;	char *rcvr, *cp;	Mlock *l;	String *tmp;	int i;	int header, body;	header = body = 0;	ARGBEGIN {	case 'h':		header = 1;		break;	case 'b':		header = 1;		body = 1;		break;	default:		usage();	} ARGEND	Binit(&bin, 0, OREAD);	if(argc < 2)		usage();	mp = m_read(&bin, 1, 0);	/* get rid of local system name */	cp = strchr(s_to_c(mp->sender), '!');	if(cp){		cp++;		mp->sender = s_copy(cp);	}	dp = d_new(s_copy(argv[0]));	strecpy(file, file+sizeof file, argv[1]);	cp = findbody(s_to_c(mp->body));	for(i = 2; i < argc; i += 2){		p = regcomp(argv[i]);		if(p == 0)			continue;		if(regexec(p, s_to_c(mp->sender), match, 10)){			regsub(argv[i+1], file, sizeof(file), match, 10);			break;		}		if(header == 0 && body == 0)			continue;		if(regexec(p, s_to_c(mp->body), match, 10)){			if(body == 0 && match[0].sp >= cp)				continue;			regsub(argv[i+1], file, sizeof(file), match, 10);			break;		}	}	/*	 *  always lock the normal mail file to avoid too many lock files	 *  lying about.  This isn't right but it's what the majority prefers.	 */	l = syslock(argv[1]);	if(l == 0){		fprint(2, "can't lock mail file %s\n", argv[1]);		exit(1);	}	/*	 *  open the destination mail file	 */	fp = sysopen(file, "ca", MBOXMODE);	if (fp == 0){		tmp = s_append(0, file);		s_append(tmp, ".tmp");		fp = sysopen(s_to_c(tmp), "cal", MBOXMODE);		if(fp == 0){			sysunlock(l);			fprint(2, "can't open mail file %s\n", file);			exit(1);		}		syslog(0, "mail", "error: used %s", s_to_c(tmp));		s_free(tmp);	}	Bseek(fp, 0, 2);	if(m_print(mp, fp, (char *)0, 1) < 0	|| Bprint(fp, "\n") < 0	|| Bflush(fp) < 0){		sysclose(fp);		sysunlock(l);		fprint(2, "can't write mail file %s\n", file);		exit(1);	}	sysclose(fp);	sysunlock(l);	rcvr = argv[0];	if(cp = strrchr(rcvr, '!'))		rcvr = cp+1;	logdelivery(dp, rcvr, mp);	exit(0);}char*findbody(char *p){	if(*p == '\n')		return p;	while(*p){		if(*p == '\n' && *(p+1) == '\n')			return p+1;		p++;	}	return p;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -