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

📄 readcf.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
		p = strchr(val, '/');		if (p != NULL)		{			*p++ = '\0';			MaxMessageSize = atol(p);		}		MinBlocksFree = atol(val);		break;	  case 'c':		/* don't connect to "expensive" mailers */		NoConnect = atobool(val);		break;	  case 'C':		/* checkpoint every N addresses */		CheckpointInterval = atoi(val);		break;	  case 'd':		/* delivery mode */		switch (*val)		{		  case '\0':			e->e_sendmode = SM_DELIVER;			break;		  case SM_QUEUE:	/* queue only */#ifndef QUEUE			syserr("need QUEUE to set -odqueue");#endif /* QUEUE */			/* fall through..... */		  case SM_DELIVER:	/* do everything */		  case SM_FORK:		/* fork after verification */			e->e_sendmode = *val;			break;		  default:			syserr("Unknown delivery mode %c", *val);			exit(EX_USAGE);		}		break;	  case 'D':		/* rebuild alias database as needed */		AutoRebuild = atobool(val);		break;	  case 'E':		/* error message header/header file */		if (*val != '\0')			ErrMsgFile = newstr(val);		break;	  case 'e':		/* set error processing mode */		switch (*val)		{		  case EM_QUIET:	/* be silent about it */		  case EM_MAIL:		/* mail back */		  case EM_BERKNET:	/* do berknet error processing */		  case EM_WRITE:	/* write back (or mail) */			HoldErrs = TRUE;			/* fall through... */		  case EM_PRINT:	/* print errors normally (default) */			e->e_errormode = *val;			break;		}		break;	  case 'F':		/* file mode */		FileMode = atooct(val) & 0777;		break;	  case 'f':		/* save Unix-style From lines on front */		SaveFrom = atobool(val);		break;	  case 'G':		/* match recipients against GECOS field */		MatchGecos = atobool(val);		break;	  case 'g':		/* default gid */		if (isascii(*val) && isdigit(*val))			DefGid = atoi(val);		else		{			register struct group *gr;			DefGid = -1;			gr = getgrnam(val);			if (gr == NULL)				syserr("readcf: option g: unknown group %s", val);			else				DefGid = gr->gr_gid;		}		break;	  case 'H':		/* help file */		if (val[0] == '\0')			HelpFile = "sendmail.hf";		else			HelpFile = newstr(val);		break;	  case 'h':		/* maximum hop count */		MaxHopCount = atoi(val);		break;	  case 'I':		/* use internet domain name server */#if NAMED_BIND		UseNameServer = TRUE;		for (p = val; *p != 0; )		{			bool clearmode;			char *q;			struct resolverflags *rfp;			while (*p == ' ')				p++;			if (*p == '\0')				break;			clearmode = FALSE;			if (*p == '-')				clearmode = TRUE;			else if (*p != '+')				p--;			p++;			q = p;			while (*p != '\0' && !(isascii(*p) && isspace(*p)))				p++;			if (*p != '\0')				*p++ = '\0';			for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++)			{				if (strcasecmp(q, rfp->rf_name) == 0)					break;			}			if (rfp->rf_name == NULL)				syserr("readcf: I option value %s unrecognized", q);			else if (clearmode)				_res.options &= ~rfp->rf_bits;			else				_res.options |= rfp->rf_bits;		}		if (tTd(8, 2))			printf("_res.options = %x\n", _res.options);#else		usrerr("name server (I option) specified but BIND not compiled in");#endif		break;	  case 'i':		/* ignore dot lines in message */		IgnrDot = atobool(val);		break;	  case 'j':		/* send errors in MIME (RFC 1341) format */		SendMIMEErrors = atobool(val);		break;	  case 'J':		/* .forward search path */		ForwardPath = newstr(val);		break;	  case 'k':		/* connection cache size */		MaxMciCache = atoi(val);		if (MaxMciCache < 0)			MaxMciCache = 0;		break;	  case 'K':		/* connection cache timeout */		MciCacheTimeout = convtime(val, 'm');		break;	  case 'l':		/* use Errors-To: header */		UseErrorsTo = atobool(val);		break;	  case 'L':		/* log level */		if (safe || LogLevel < atoi(val))			LogLevel = atoi(val);		break;	  case 'M':		/* define macro */		define(val[0], newstr(&val[1]), CurEnv);		sticky = FALSE;		break;	  case 'm':		/* send to me too */		MeToo = atobool(val);		break;	  case 'n':		/* validate RHS in newaliases */		CheckAliases = atobool(val);		break;	    /* 'N' available -- was "net name" */	  case 'O':		/* daemon options */		setdaemonoptions(val);		break;	  case 'o':		/* assume old style headers */		if (atobool(val))			CurEnv->e_flags |= EF_OLDSTYLE;		else			CurEnv->e_flags &= ~EF_OLDSTYLE;		break;	  case 'p':		/* select privacy level */		p = val;		for (;;)		{			register struct prival *pv;			extern struct prival PrivacyValues[];			while (isascii(*p) && (isspace(*p) || ispunct(*p)))				p++;			if (*p == '\0')				break;			val = p;			while (isascii(*p) && isalnum(*p))				p++;			if (*p != '\0')				*p++ = '\0';			for (pv = PrivacyValues; pv->pv_name != NULL; pv++)			{				if (strcasecmp(val, pv->pv_name) == 0)					break;			}			if (pv->pv_name == NULL)				syserr("readcf: Op line: %s unrecognized", val);			PrivacyFlags |= pv->pv_flag;		}		break;	  case 'P':		/* postmaster copy address for returned mail */		PostMasterCopy = newstr(val);		break;	  case 'q':		/* slope of queue only function */		QueueFactor = atoi(val);		break;	  case 'Q':		/* queue directory */		if (val[0] == '\0')			QueueDir = "mqueue";		else			QueueDir = newstr(val);		if (RealUid != 0 && !safe)			Warn_Q_option = TRUE;		break;	  case 'R':		/* don't prune routes */		DontPruneRoutes = atobool(val);		break;	  case 'r':		/* read timeout */		settimeouts(val);		break;	  case 'S':		/* status file */		if (val[0] == '\0')			StatFile = "sendmail.st";		else			StatFile = newstr(val);		break;	  case 's':		/* be super safe, even if expensive */		SuperSafe = atobool(val);		break;	  case 'T':		/* queue timeout */		p = strchr(val, '/');		if (p != NULL)		{			*p++ = '\0';			TimeOuts.to_q_warning = convtime(p, 'd');		}		TimeOuts.to_q_return = convtime(val, 'h');		break;	  case 't':		/* time zone name */		TimeZoneSpec = newstr(val);		break;	  case 'U':		/* location of user database */		UdbSpec = newstr(val);		break;	  case 'u':		/* set default uid */		if (isascii(*val) && isdigit(*val))			DefUid = atoi(val);		else		{			register struct passwd *pw;			DefUid = -1;			pw = getpwnam(val);			if (pw == NULL)				syserr("readcf: option u: unknown user %s", val);			else				DefUid = pw->pw_uid;		}		setdefuser();		break;	  case 'V':		/* fallback MX host */		FallBackMX = newstr(val);		break;	  case 'v':		/* run in verbose mode */		Verbose = atobool(val);		break;	  case 'w':		/* if we are best MX, try host directly */		TryNullMXList = atobool(val);		break;	    /* 'W' available -- was wizard password */	  case 'x':		/* load avg at which to auto-queue msgs */		QueueLA = atoi(val);		break;	  case 'X':		/* load avg at which to auto-reject connections */		RefuseLA = atoi(val);		break;	  case 'y':		/* work recipient factor */		WkRecipFact = atoi(val);		break;	  case 'Y':		/* fork jobs during queue runs */		ForkQueueRuns = atobool(val);		break;	  case 'z':		/* work message class factor */		WkClassFact = atoi(val);		break;	  case 'Z':		/* work time factor */		WkTimeFact = atoi(val);		break;	  default:		break;	}	if (sticky)		setbitn(opt, StickyOpt);	return;}/***  SETCLASS -- set a word into a class****	Parameters:**		class -- the class to put the word in.**		word -- the word to enter****	Returns:**		none.****	Side Effects:**		puts the word into the symbol table.*/setclass(class, word)	int class;	char *word;{	register STAB *s;	if (tTd(37, 8))		printf("setclass(%c, %s)\n", class, word);	s = stab(word, ST_CLASS, ST_ENTER);	setbitn(class, s->s_class);}/***  MAKEMAPENTRY -- create a map entry****	Parameters:**		line -- the config file line****	Returns:**		TRUE if it successfully entered the map entry.**		FALSE otherwise (usually syntax error).****	Side Effects:**		Enters the map into the dictionary.*/voidmakemapentry(line)	char *line;{	register char *p;	char *mapname;	char *classname;	register STAB *s;	STAB *class;	for (p = line; isascii(*p) && isspace(*p); p++)		continue;	if (!(isascii(*p) && isalnum(*p)))	{		syserr("readcf: config K line: no map name");		return;	}	mapname = p;	while (isascii(*++p) && isalnum(*p))		continue;	if (*p != '\0')		*p++ = '\0';	while (isascii(*p) && isspace(*p))		p++;	if (!(isascii(*p) && isalnum(*p)))	{		syserr("readcf: config K line, map %s: no map class", mapname);		return;	}	classname = p;	while (isascii(*++p) && isalnum(*p))		continue;	if (*p != '\0')		*p++ = '\0';	while (isascii(*p) && isspace(*p))		p++;	/* look up the class */	class = stab(classname, ST_MAPCLASS, ST_FIND);	if (class == NULL)	{		syserr("readcf: map %s: class %s not available", mapname, classname);		return;	}	/* enter the map */	s = stab(mapname, ST_MAP, ST_ENTER);	s->s_map.map_class = &class->s_mapclass;	s->s_map.map_mname = newstr(mapname);	if (class->s_mapclass.map_parse(&s->s_map, p))		s->s_map.map_mflags |= MF_VALID;	if (tTd(37, 5))	{		printf("map %s, class %s, flags %x, file %s,\n",			s->s_map.map_mname, s->s_map.map_class->map_cname,			s->s_map.map_mflags,			s->s_map.map_file == NULL ? "(null)" : s->s_map.map_file);		printf("\tapp %s, domain %s, rebuild %s\n",			s->s_map.map_app == NULL ? "(null)" : s->s_map.map_app,			s->s_map.map_domain == NULL ? "(null)" : s->s_map.map_domain,			s->s_map.map_rebuild == NULL ? "(null)" : s->s_map.map_rebuild);	}}/***  SETTIMEOUTS -- parse and set timeout values****	Parameters:**		val -- a pointer to the values.  If NULL, do initial**			settings.****	Returns:**		none.****	Side Effects:**		Initializes the TimeOuts structure*/#define SECONDS#define MINUTES	* 60#define HOUR	* 3600settimeouts(val)	register char *val;{	register char *p;	extern time_t convtime();	if (val == NULL)	{		TimeOuts.to_initial = (time_t) 5 MINUTES;		TimeOuts.to_helo = (time_t) 5 MINUTES;		TimeOuts.to_mail = (time_t) 10 MINUTES;		TimeOuts.to_rcpt = (time_t) 1 HOUR;		TimeOuts.to_datainit = (time_t) 5 MINUTES;		TimeOuts.to_datablock = (time_t) 1 HOUR;		TimeOuts.to_datafinal = (time_t) 1 HOUR;		TimeOuts.to_rset = (time_t) 5 MINUTES;		TimeOuts.to_quit = (time_t) 2 MINUTES;		TimeOuts.to_nextcommand = (time_t) 1 HOUR;		TimeOuts.to_miscshort = (time_t) 2 MINUTES;		TimeOuts.to_ident = (time_t) 30 SECONDS;		return;	}	for (;; val = p)	{		while (isascii(*val) && isspace(*val))			val++;		if (*val == '\0')			break;		for (p = val; *p != '\0' && *p != ','; p++)			continue;		if (*p != '\0')			*p++ = '\0';		if (isascii(*val) && isdigit(*val))		{			/* old syntax -- set everything */			TimeOuts.to_mail = convtime(val, 'm');			TimeOuts.to_rcpt = TimeOuts.to_mail;			TimeOuts.to_datainit = TimeOuts.to_mail;			TimeOuts.to_datablock = TimeOuts.to_mail;			TimeOuts.to_datafinal = TimeOuts.to_mail;			TimeOuts.to_nextcommand = TimeOuts.to_mail;			continue;		}		else		{			register char *q = strchr(val, '=');			time_t to;			if (q == NULL)			{				/* syntax error */				continue;			}			*q++ = '\0';			to = convtime(q, 'm');			if (strcasecmp(val, "initial") == 0)				TimeOuts.to_initial = to;			else if (strcasecmp(val, "mail") == 0)				TimeOuts.to_mail = to;			else if (strcasecmp(val, "rcpt") == 0)				TimeOuts.to_rcpt = to;			else if (strcasecmp(val, "datainit") == 0)				TimeOuts.to_datainit = to;			else if (strcasecmp(val, "datablock") == 0)				TimeOuts.to_datablock = to;			else if (strcasecmp(val, "datafinal") == 0)				TimeOuts.to_datafinal = to;			else if (strcasecmp(val, "command") == 0)				TimeOuts.to_nextcommand = to;			else if (strcasecmp(val, "rset") == 0)				TimeOuts.to_rset = to;			else if (strcasecmp(val, "helo") == 0)				TimeOuts.to_helo = to;			else if (strcasecmp(val, "quit") == 0)				TimeOuts.to_quit = to;			else if (strcasecmp(val, "misc") == 0)				TimeOuts.to_miscshort = to;			else if (strcasecmp(val, "ident") == 0)				TimeOuts.to_ident = to;			else				syserr("settimeouts: invalid timeout %s", val);		}	}}

⌨️ 快捷键说明

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