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

📄 envelope.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* hop count */	(void) sprintf(cbuf, "%d", e->e_hopcount);	define('c', newstr(cbuf), e);	/* time as integer, unix time, arpa time */	settime(e);#ifdef TTYNAME	/* tty name */	if (macvalue('y', e) == NULL)	{		p = ttyname(2);		if (p != NULL)		{			if (strrchr(p, '/') != NULL)				p = strrchr(p, '/') + 1;			(void) strcpy(ybuf, p);			define('y', ybuf, e);		}	}#endif /* TTYNAME */}/***  SETTIME -- set the current time.****	Parameters:**		none.****	Returns:**		none.****	Side Effects:**		Sets the various time macros -- $a, $b, $d, $t.*/voidsettime(e)	register ENVELOPE *e;{	register char *p;	auto time_t now;	char tbuf[20];				/* holds "current" time */	char dbuf[30];				/* holds ctime(tbuf) */	register struct tm *tm;	extern char *arpadate();	extern struct tm *gmtime();	now = curtime();	tm = gmtime(&now);	(void) sprintf(tbuf, "%04d%02d%02d%02d%02d", tm->tm_year + 1900,			tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min);	define('t', newstr(tbuf), e);	(void) strcpy(dbuf, ctime(&now));	p = strchr(dbuf, '\n');	if (p != NULL)		*p = '\0';	define('d', newstr(dbuf), e);	p = arpadate(dbuf);	p = newstr(p);	if (macvalue('a', e) == NULL)		define('a', p, e);	define('b', p, e);}/***  OPENXSCRIPT -- Open transcript file****	Creates a transcript file for possible eventual mailing or**	sending back.****	Parameters:**		e -- the envelope to create the transcript in/for.****	Returns:**		none****	Side Effects:**		Creates the transcript file.*/#ifndef O_APPEND#define O_APPEND	0#endifvoidopenxscript(e)	register ENVELOPE *e;{	register char *p;	int fd;	if (e->e_xfp != NULL)		return;	p = queuename(e, 'x');	fd = open(p, O_WRONLY|O_CREAT|O_APPEND, 0644);	if (fd < 0)	{		syserr("Can't create transcript file %s", p);		fd = open("/dev/null", O_WRONLY, 0644);		if (fd < 0)			syserr("!Can't open /dev/null");	}	e->e_xfp = fdopen(fd, "w");	if (e->e_xfp == NULL)	{		syserr("!Can't create transcript stream %s", p);	}	if (tTd(46, 9))	{		printf("openxscript(%s):\n  ", p);		dumpfd(fileno(e->e_xfp), TRUE, FALSE);	}}/***  CLOSEXSCRIPT -- close the transcript file.****	Parameters:**		e -- the envelope containing the transcript to close.****	Returns:**		none.****	Side Effects:**		none.*/voidclosexscript(e)	register ENVELOPE *e;{	if (e->e_xfp == NULL)		return;	(void) xfclose(e->e_xfp, "closexscript", e->e_id);	e->e_xfp = NULL;}/***  SETSENDER -- set the person who this message is from****	Under certain circumstances allow the user to say who**	s/he is (using -f or -r).  These are:**	1.  The user's uid is zero (root).**	2.  The user's login name is in an approved list (typically**	    from a network server).**	3.  The address the user is trying to claim has a**	    "!" character in it (since #2 doesn't do it for**	    us if we are dialing out for UUCP).**	A better check to replace #3 would be if the**	effective uid is "UUCP" -- this would require me**	to rewrite getpwent to "grab" uucp as it went by,**	make getname more nasty, do another passwd file**	scan, or compile the UID of "UUCP" into the code,**	all of which are reprehensible.****	Assuming all of these fail, we figure out something**	ourselves.****	Parameters:**		from -- the person we would like to believe this message**			is from, as specified on the command line.**		e -- the envelope in which we would like the sender set.**		delimptr -- if non-NULL, set to the location of the**			trailing delimiter.**		internal -- set if this address is coming from an internal**			source such as an owner alias.****	Returns:**		none.****	Side Effects:**		sets sendmail's notion of who the from person is.*/voidsetsender(from, e, delimptr, internal)	char *from;	register ENVELOPE *e;	char **delimptr;	bool internal;{	register char **pvp;	char *realname = NULL;	register struct passwd *pw;	char delimchar;	char *bp;	char buf[MAXNAME + 2];	char pvpbuf[PSBUFSIZE];	extern struct passwd *getpwnam();	extern char *FullName;	if (tTd(45, 1))		printf("setsender(%s)\n", from == NULL ? "" : from);	/*	**  Figure out the real user executing us.	**	Username can return errno != 0 on non-errors.	*/	if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP ||	    OpMode == MD_ARPAFTP || OpMode == MD_DAEMON)		realname = from;	if (realname == NULL || realname[0] == '\0')		realname = username();	if (ConfigLevel < 2)		SuprErrs = TRUE;	delimchar = internal ? '\0' : ' ';	e->e_from.q_flags = QBADADDR;	if (from == NULL ||	    parseaddr(from, &e->e_from, RF_COPYALL|RF_SENDERADDR,		      delimchar, delimptr, e) == NULL ||	    bitset(QBADADDR, e->e_from.q_flags) ||	    e->e_from.q_mailer == ProgMailer ||	    e->e_from.q_mailer == FileMailer ||	    e->e_from.q_mailer == InclMailer)	{		/* log garbage addresses for traceback */# ifdef LOG		if (from != NULL && LogLevel > 2)		{			char *p;			char ebuf[MAXNAME * 2 + 2];			p = macvalue('_', e);			if (p == NULL)			{				char *host = RealHostName;				if (host == NULL)					host = MyHostName;				(void) sprintf(ebuf, "%s@%s", realname, host);				p = ebuf;			}			syslog(LOG_NOTICE,				"setsender: %s: invalid or unparseable, received from %s",				shortenstring(from, 83), p);		}# endif /* LOG */		if (from != NULL)		{			if (!bitset(QBADADDR, e->e_from.q_flags))			{				/* it was a bogus mailer in the from addr */				usrerr("553 Invalid sender address");			}			SuprErrs = TRUE;		}		if (from == realname ||		    parseaddr(from = newstr(realname), &e->e_from,			      RF_COPYALL|RF_SENDERADDR, ' ', NULL, e) == NULL)		{			char nbuf[100];			SuprErrs = TRUE;			expand("\201n", nbuf, &nbuf[sizeof nbuf], e);			if (parseaddr(from = newstr(nbuf), &e->e_from,				      RF_COPYALL, ' ', NULL, e) == NULL &&			    parseaddr(from = "postmaster", &e->e_from,			    	      RF_COPYALL, ' ', NULL, e) == NULL)				syserr("553 setsender: can't even parse postmaster!");		}	}	else		FromFlag = TRUE;	e->e_from.q_flags |= QDONTSEND;	if (tTd(45, 5))	{		printf("setsender: QDONTSEND ");		printaddr(&e->e_from, FALSE);	}	SuprErrs = FALSE;	pvp = NULL;	if (e->e_from.q_mailer == LocalMailer)	{# ifdef USERDB		register char *p;		extern char *udbsender();# endif		if (!internal)		{			/* if the user has given fullname already, don't redefine */			if (FullName == NULL)				FullName = macvalue('x', e);			if (FullName != NULL && FullName[0] == '\0')				FullName = NULL;# ifdef USERDB			p = udbsender(e->e_from.q_user);			if (p != NULL)			{				/*				**  We have an alternate address for the sender				*/				pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL);			}# endif /* USERDB */		}		if ((pw = getpwnam(e->e_from.q_user)) != NULL)		{			/*			**  Process passwd file entry.			*/			/* extract home directory */			if (strcmp(pw->pw_dir, "/") == 0)				e->e_from.q_home = newstr("");			else				e->e_from.q_home = newstr(pw->pw_dir);			define('z', e->e_from.q_home, e);			/* extract user and group id */			e->e_from.q_uid = pw->pw_uid;			e->e_from.q_gid = pw->pw_gid;			e->e_from.q_flags |= QGOODUID;			/* extract full name from passwd file */			if (FullName == NULL && pw->pw_gecos != NULL &&			    strcmp(pw->pw_name, e->e_from.q_user) == 0 &&			    !internal)			{				buildfname(pw->pw_gecos, e->e_from.q_user, buf);				if (buf[0] != '\0')					FullName = newstr(buf);			}		}		if (FullName != NULL && !internal)			define('x', FullName, e);	}	else if (!internal && OpMode != MD_DAEMON)	{		if (e->e_from.q_home == NULL)		{			e->e_from.q_home = getenv("HOME");			if (e->e_from.q_home != NULL &&			    strcmp(e->e_from.q_home, "/") == 0)				e->e_from.q_home++;		}		e->e_from.q_uid = RealUid;		e->e_from.q_gid = RealGid;		e->e_from.q_flags |= QGOODUID;	}	/*	**  Rewrite the from person to dispose of possible implicit	**	links in the net.	*/	if (pvp == NULL)		pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL);	if (pvp == NULL)	{		/* don't need to give error -- prescan did that already */# ifdef LOG		if (LogLevel > 2)			syslog(LOG_NOTICE, "cannot prescan from (%s)", from);# endif		finis();	}	(void) rewrite(pvp, 3, 0, e);	(void) rewrite(pvp, 1, 0, e);	(void) rewrite(pvp, 4, 0, e);	bp = buf + 1;	cataddr(pvp, NULL, bp, sizeof buf - 2, '\0');	if (*bp == '@')	{		/* heuristic: route-addr: add angle brackets */		strcat(bp, ">");		*--bp = '<';	}	e->e_sender = newstr(bp);	define('f', e->e_sender, e);	/* save the domain spec if this mailer wants it */	if (e->e_from.q_mailer != NULL &&	    bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags))	{		extern char **copyplist();		while (*pvp != NULL && strcmp(*pvp, "@") != 0)			pvp++;		if (*pvp != NULL)			e->e_fromdomain = copyplist(pvp, TRUE);	}}

⌨️ 快捷键说明

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