X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/1c15e88899094343f75aeba04122cd96a96b428e..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/usr.sbin/sendmail/src/macro.c diff --git a/usr/src/usr.sbin/sendmail/src/macro.c b/usr/src/usr.sbin/sendmail/src/macro.c index e11a850e19..877251debb 100644 --- a/usr/src/usr.sbin/sendmail/src/macro.c +++ b/usr/src/usr.sbin/sendmail/src/macro.c @@ -1,25 +1,39 @@ /* * Copyright (c) 1983 Eric P. Allman - * Copyright (c) 1988 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. * - * Redistribution and use in source and binary forms are permitted provided - * that: (1) source distributions retain this entire copyright notice and - * comment, and (2) distributions including binaries display the following - * acknowledgement: ``This product includes software developed by the - * University of California, Berkeley and its contributors'' in the - * documentation or other materials provided with the distribution and in - * all advertising materials mentioning features or use of this software. - * Neither the name of the University nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #ifndef lint -static char sccsid[] = "@(#)macro.c 5.7 (Berkeley) 6/1/90"; +static char sccsid[] = "@(#)macro.c 8.1 (Berkeley) 6/7/93"; #endif /* not lint */ # include "sendmail.h" @@ -41,6 +55,7 @@ static char sccsid[] = "@(#)macro.c 5.7 (Berkeley) 6/1/90"; ** none. */ +void expand(s, buf, buflim, e) register char *s; register char *buf; @@ -52,8 +67,8 @@ expand(s, buf, buflim, e) bool skipping; /* set if conditionally skipping output */ bool recurse = FALSE; /* set if recursion required */ int i; + int iflev; /* if nesting level */ char xbuf[BUFSIZ]; - extern char *macvalue(); if (tTd(35, 24)) { @@ -63,6 +78,7 @@ expand(s, buf, buflim, e) } skipping = FALSE; + iflev = 0; if (s == NULL) s = ""; for (xp = xbuf; *s != '\0'; s++) @@ -76,22 +92,29 @@ expand(s, buf, buflim, e) q = NULL; c = *s; - switch (c) + switch (c & 0377) { case CONDIF: /* see if var set */ c = *++s; - skipping = macvalue(c, e) == NULL; + if (skipping) + iflev++; + else + skipping = macvalue(c, e) == NULL; continue; case CONDELSE: /* change state of skipping */ - skipping = !skipping; + if (iflev == 0) + skipping = !skipping; continue; case CONDFI: /* stop skipping */ - skipping = FALSE; + if (iflev == 0) + skipping = FALSE; + if (skipping) + iflev--; continue; - case '\001': /* macro interpolation */ + case MACROEXPAND: /* macro interpolation */ c = *++s; q = macvalue(c & 0177, e); if (q == NULL) @@ -112,7 +135,8 @@ expand(s, buf, buflim, e) /* copy to end of q or max space remaining in buf */ while ((c = *q++) != '\0' && xp < &xbuf[sizeof xbuf - 1]) { - if (iscntrl(c) && !isspace(c)) + /* check for any sendmail metacharacters */ + if ((c & 0340) == 0200) recurse = TRUE; *xp++ = c; } @@ -174,7 +198,9 @@ expand(s, buf, buflim, e) ** $h to host ** $i queue id ** $j official SMTP hostname, used in messages+ +** $k UUCP node name ** $l UNIX-style from line+ +** $m The domain part of our full name. ** $n name of sendmail ("MAILER-DAEMON" on local ** net typically)+ ** $o delimiters ("operators") for address tokens+ @@ -190,6 +216,7 @@ expand(s, buf, buflim, e) ** $x signature (full name) of from person ** $y the tty id of our terminal ** $z home directory of to person +** $_ RFC1413 authenticated sender address ** ** Macros marked with + must be defined in the ** configuration file and are used internally, but @@ -201,6 +228,7 @@ expand(s, buf, buflim, e) ** are available. */ +void define(n, v, e) char n; char *v;