BSD 4_4 release
[unix-history] / usr / src / usr.sbin / sendmail / src / macro.c
index e11a850..877251d 100644 (file)
@@ -1,25 +1,39 @@
 /*
  * Copyright (c) 1983 Eric P. Allman
 /*
  * 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
  */
 
 #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"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -41,6 +55,7 @@ static char sccsid[] = "@(#)macro.c   5.7 (Berkeley) 6/1/90";
 **             none.
 */
 
 **             none.
 */
 
+void
 expand(s, buf, buflim, e)
        register char *s;
        register char *buf;
 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;
        bool skipping;          /* set if conditionally skipping output */
        bool recurse = FALSE;   /* set if recursion required */
        int i;
+       int iflev;              /* if nesting level */
        char xbuf[BUFSIZ];
        char xbuf[BUFSIZ];
-       extern char *macvalue();
 
        if (tTd(35, 24))
        {
 
        if (tTd(35, 24))
        {
@@ -63,6 +78,7 @@ expand(s, buf, buflim, e)
        }
 
        skipping = FALSE;
        }
 
        skipping = FALSE;
+       iflev = 0;
        if (s == NULL)
                s = "";
        for (xp = xbuf; *s != '\0'; s++)
        if (s == NULL)
                s = "";
        for (xp = xbuf; *s != '\0'; s++)
@@ -76,22 +92,29 @@ expand(s, buf, buflim, e)
 
                q = NULL;
                c = *s;
 
                q = NULL;
                c = *s;
-               switch (c)
+               switch (c & 0377)
                {
                  case CONDIF:          /* see if var set */
                        c = *++s;
                {
                  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 */
                        continue;
 
                  case CONDELSE:        /* change state of skipping */
-                       skipping = !skipping;
+                       if (iflev == 0)
+                               skipping = !skipping;
                        continue;
 
                  case CONDFI:          /* stop skipping */
                        continue;
 
                  case CONDFI:          /* stop skipping */
-                       skipping = FALSE;
+                       if (iflev == 0)
+                               skipping = FALSE;
+                       if (skipping)
+                               iflev--;
                        continue;
 
                        continue;
 
-                 case '\001':          /* macro interpolation */
+                 case MACROEXPAND:     /* macro interpolation */
                        c = *++s;
                        q = macvalue(c & 0177, e);
                        if (q == NULL)
                        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])
                        {
                        /* 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;
                        }
                                        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+
 **             $h   to host
 **             $i   queue id
 **             $j   official SMTP hostname, used in messages+
+**             $k   UUCP node name
 **             $l   UNIX-style from line+
 **             $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+
 **             $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
 **             $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
 **
 **             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.
 */
 
 **             are available.
 */
 
+void
 define(n, v, e)
        char n;
        char *v;
 define(n, v, e)
        char n;
        char *v;