2 * Copyright (c) 1998-2001, 2003, 2006, 2007 Sendmail, Inc. and its suppliers.
4 * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
5 * Copyright (c) 1988, 1993
6 * The Regents of the University of California. All rights reserved.
8 * By using this file, you agree to the terms and conditions set
9 * forth in the LICENSE file which can be found at the top level of
10 * the sendmail distribution.
16 SM_RCSID("@(#)$Id: macro.c,v 8.107 2007/08/06 22:29:02 ca Exp $")
18 #include <sm/sendmail.h>
19 #if MAXMACROID != (BITMAPBITS - 1)
20 ERROR Read the comment in conf
.h
21 #endif /* MAXMACROID != (BITMAPBITS - 1) */
23 static char *MacroName
[MAXMACROID
+ 1]; /* macro id to name table */
26 ** Codes for long named macros.
27 ** See also macname():
28 * if not ASCII printable, look up the name *
29 if (n <= 0x20 || n > 0x7f)
30 ** First use 1 to NEXTMACROID_L, then use NEXTMACROID_H to MAXMACROID.
33 #define NEXTMACROID_L 037
34 #define NEXTMACROID_H 0240
37 /* table for next id in non-printable ASCII range: disallow some value */
38 static int NextMIdTable
[] =
75 #define NEXTMACROID(mid) ( \
76 (mid < NEXTMACROID_L) ? (NextMIdTable[mid]) : \
77 ((mid < NEXTMACROID_H) ? NEXTMACROID_H : (mid + 1)))
79 int NextMacroId
= 1; /* codes for long named macros */
80 /* see sendmail.h: Special characters in rewriting rules. */
81 #else /* _FFR_MORE_MACROS */
82 int NextMacroId
= 0240; /* codes for long named macros */
83 #define NEXTMACROID(mid) ((mid) + 1)
84 #endif /* _FFR_MORE_MACROS */
88 ** INITMACROS -- initialize the macro system
90 ** This just involves defining some macros that are actually
91 ** used internally as metasymbols to be themselves.
100 ** initializes several macros to be themselves.
103 struct metamac MetaMacros
[] =
105 /* LHS pattern matching characters */
106 { '*', MATCHZANY
}, { '+', MATCHANY
}, { '-', MATCHONE
},
107 { '=', MATCHCLASS
}, { '~', MATCHNCLASS
},
109 /* these are RHS metasymbols */
110 { '#', CANONNET
}, { '@', CANONHOST
}, { ':', CANONUSER
},
113 /* the conditional operations */
114 { '?', CONDIF
}, { '|', CONDELSE
}, { '.', CONDFI
},
116 /* the hostname lookup characters */
117 { '[', HOSTBEGIN
}, { ']', HOSTEND
},
118 { '(', LOOKUPBEGIN
}, { ')', LOOKUPEND
},
120 /* miscellaneous control characters */
121 { '&', MACRODEXPAND
},
126 #define MACBINDING(name, mid) \
127 stab(name, ST_MACRO, ST_ENTER)->s_macro = mid; \
128 MacroName[mid] = name;
138 for (m
= MetaMacros
; m
->metaname
!= '\0'; m
++)
142 macdefine(&e
->e_macro
, A_TEMP
, m
->metaname
, buf
);
146 for (c
= '0'; c
<= '9'; c
++)
149 macdefine(&e
->e_macro
, A_TEMP
, c
, buf
);
152 /* set defaults for some macros sendmail will use later */
153 macdefine(&e
->e_macro
, A_PERM
, 'n', "MAILER-DAEMON");
155 /* set up external names for some internal macros */
156 MACBINDING("opMode", MID_OPMODE
);
157 /*XXX should probably add equivalents for all short macros here XXX*/
161 ** EXPAND/DOEXPAND -- macro expand a string using $x escapes.
163 ** After expansion, the expansion will be in external form (that is,
164 ** there will be no sendmail metacharacters and METAQUOTEs will have
165 ** been stripped out).
168 ** s -- the string to expand.
169 ** buf -- the place to put the expansion.
170 ** bufsize -- the size of the buffer.
171 ** explevel -- the depth of expansion (doexpand only)
172 ** e -- envelope in which to work.
181 static void doexpand
__P(( char *, char *, size_t, int, ENVELOPE
*));
184 doexpand(s
, buf
, bufsize
, explevel
, e
)
193 bool skipping
; /* set if conditionally skipping output */
194 bool recurse
; /* set if recursion required */
196 int skiplev
; /* skipping nesting level */
197 int iflev
; /* if nesting level */
198 bool quotenext
; /* quote the following character */
199 char xbuf
[MACBUFSIZE
];
203 sm_dprintf("expand(");
204 xputs(sm_debug_file(), s
);
215 for (xp
= xbuf
; *s
!= '\0'; s
++)
220 ** Check for non-ordinary (special?) character.
221 ** 'q' will be the interpolated quantity.
230 goto simpleinterpolate
;
235 case CONDIF
: /* see if var set */
245 skipping
= (mv
== NULL
|| *mv
== '\0');
249 case CONDELSE
: /* change state of skipping */
251 break; /* XXX: error */
253 skipping
= !skipping
;
256 case CONDFI
: /* stop skipping */
258 break; /* XXX: error */
266 case MACROEXPAND
: /* macro interpolation */
280 /* next octet completely quoted */
286 ** Interpolate q or output one character
290 if (skipping
|| xp
>= &xbuf
[sizeof(xbuf
) - 1])
296 /* copy to end of q or max space remaining in buf */
297 bool hiderecurse
= false;
299 while ((c
= *q
++) != '\0' &&
300 xp
< &xbuf
[sizeof(xbuf
) - 1])
302 /* check for any sendmail metacharacters */
303 if (!hiderecurse
&& (c
& 0340) == 0200)
307 /* give quoted characters a free ride */
308 hiderecurse
= (c
& 0377) == METAQUOTE
;
316 sm_dprintf("expand(%d) ==> ", explevel
);
317 xputs(sm_debug_file(), xbuf
);
321 /* recurse as appropriate */
324 if (explevel
< MaxMacroRecursion
)
326 doexpand(xbuf
, buf
, bufsize
, explevel
+ 1, e
);
329 syserr("expand: recursion too deep (%d max)",
333 /* copy results out */
335 (void) sm_strlcpy(buf
, xbuf
, bufsize
);
338 /* leave in internal form */
342 memmove(buf
, xbuf
, i
);
348 sm_dprintf("expand ==> ");
349 xputs(sm_debug_file(), buf
);
355 expand(s
, buf
, bufsize
, e
)
361 doexpand(s
, buf
, bufsize
, 0, e
);
365 ** MACDEFINE -- bind a macro name to a value
367 ** Set a macro to a value, with fancy storage management.
368 ** macdefine will make a copy of the value, if required,
369 ** and will ensure that the storage for the previous value
373 ** mac -- Macro table.
374 ** vclass -- storage class of 'value', ignored if value==NULL.
375 ** A_HEAP means that the value was allocated by
376 ** malloc, and that macdefine owns the storage.
377 ** A_TEMP means that value points to temporary storage,
378 ** and thus macdefine needs to make a copy.
379 ** A_PERM means that value points to storage that
380 ** will remain allocated and unchanged for
381 ** at least the lifetime of mac. Use A_PERM if:
383 ** -- value points to a string literal,
384 ** -- value was allocated from mac->mac_rpool
385 ** or (in the case of an envelope macro)
387 ** -- in the case of an envelope macro,
388 ** value is a string member of the envelope
389 ** such as e->e_sender.
390 ** id -- Macro id. This is a single character macro name
391 ** such as 'g', or a value returned by macid().
392 ** value -- Macro value: either NULL, or a string.
397 macdefine_tagged(mac
, vclass
, id
, value
, file
, line
, grp
)
398 #else /* SM_HEAP_CHECK */
399 macdefine(mac
, vclass
, id
, value
)
400 #endif /* SM_HEAP_CHECK */
409 #endif /* SM_HEAP_CHECK */
413 if (id
< 0 || id
> MAXMACROID
)
418 sm_dprintf("%sdefine(%s as ",
419 mac
->mac_table
[id
] == NULL
? "" : "re", macname(id
));
420 xputs(sm_debug_file(), value
);
424 if (mac
->mac_rpool
== NULL
)
428 if (mac
->mac_table
[id
] != NULL
&&
429 bitnset(id
, mac
->mac_allocated
))
430 freeit
= mac
->mac_table
[id
];
432 if (value
== NULL
|| vclass
== A_HEAP
)
434 sm_heap_checkptr_tagged(value
, file
, line
);
436 clrbitn(id
, mac
->mac_allocated
);
441 newvalue
= sm_strdup_tagged_x(value
, file
, line
, 0);
442 #else /* SM_HEAP_CHECK */
443 newvalue
= sm_strdup_x(value
);
444 #endif /* SM_HEAP_CHECK */
445 setbitn(id
, mac
->mac_allocated
);
447 mac
->mac_table
[id
] = newvalue
;
453 if (value
== NULL
|| vclass
== A_PERM
)
456 newvalue
= sm_rpool_strdup_x(mac
->mac_rpool
, value
);
457 mac
->mac_table
[id
] = newvalue
;
458 if (vclass
== A_HEAP
)
462 #if _FFR_RESET_MACRO_GLOBALS
466 PSTRSET(MyHostName
, value
);
469 #endif /* _FFR_RESET_MACRO_GLOBALS */
473 ** MACSET -- set a named macro to a value (low level)
475 ** No fancy storage management; the caller takes full responsibility.
476 ** Often used with macget; see also macdefine.
479 ** mac -- Macro table.
480 ** i -- Macro name, specified as an integer offset.
481 ** value -- Macro value: either NULL, or a string.
485 macset(mac
, i
, value
)
490 if (i
< 0 || i
> MAXMACROID
)
495 sm_dprintf("macset(%s as ", macname(i
));
496 xputs(sm_debug_file(), value
);
499 mac
->mac_table
[i
] = value
;
503 ** MACVALUE -- return uninterpreted value of a macro.
505 ** Does fancy path searching.
506 ** The low level counterpart is macget.
509 ** n -- the name of the macro.
510 ** e -- envelope in which to start looking for the macro.
525 if (e
!= NULL
&& e
->e_mci
!= NULL
)
527 char *p
= e
->e_mci
->mci_macro
.mac_table
[n
];
534 char *p
= e
->e_macro
.mac_table
[n
];
538 if (e
== e
->e_parent
)
542 return GlobalMacros
.mac_table
[n
];
546 ** MACNAME -- return the name of a macro given its internal id
549 ** n -- the id of the macro
567 n
= (int)(unsigned char)n
;
569 return "***OUT OF RANGE MACRO***";
571 /* if not ASCII printable, look up the name */
572 if (n
<= 0x20 || n
> 0x7f)
574 char *p
= MacroName
[n
];
578 return "***UNDEFINED MACRO***";
581 /* if in the ASCII graphic range, just return the id directly */
588 ** MACID_PARSE -- return id of macro identified by its name
591 ** p -- pointer to name string -- either a single
592 ** character or {name}.
593 ** ep -- filled in with the pointer to the byte
597 ** 0 -- An error was detected.
598 ** 1..MAXMACROID -- The internal id code for this macro.
601 ** If this is a new macro name, a new id is allocated.
602 ** On error, syserr is called.
612 char mbuf
[MAXMACNAMELEN
+ 1];
616 sm_dprintf("macid(");
617 xputs(sm_debug_file(), p
);
621 if (*p
== '\0' || (p
[0] == '{' && p
[1] == '}'))
623 syserr("Name required for macro/class");
627 sm_dprintf("NULL\n");
632 /* the macro is its own code */
641 xputs(sm_debug_file(), buf
);
647 while (*++p
!= '\0' && *p
!= '}' && bp
< &mbuf
[sizeof(mbuf
) - 1])
649 if (isascii(*p
) && (isalnum(*p
) || *p
== '_'))
652 syserr("Invalid macro/class character %c", *p
);
658 syserr("Unbalanced { on %s", mbuf
); /* missing } */
662 syserr("Macro/class name ({%s}) too long (%d chars max)",
663 mbuf
, (int) (sizeof(mbuf
) - 1));
665 else if (mbuf
[1] == '\0' && mbuf
[0] >= 0x20)
668 mid
= bitidx(mbuf
[0]);
675 s
= stab(mbuf
, ST_MACRO
, ST_ENTER
);
680 if (NextMacroId
> MAXMACROID
)
682 syserr("Macro/class {%s}: too many long names",
688 MacroName
[NextMacroId
] = s
->s_name
;
689 s
->s_macro
= mid
= NextMacroId
;
690 NextMacroId
= NEXTMACROID(NextMacroId
);
697 if (mid
< 0 || mid
> MAXMACROID
)
699 syserr("Unable to assign macro/class ID (mid = 0x%x)", mid
);
701 sm_dprintf("NULL\n");
705 sm_dprintf("0x%x\n", mid
);
710 ** WORDINCLASS -- tell if a word is in a specific class
713 ** str -- the name of the word to look up.
714 ** cl -- the class name.
717 ** true if str can be found in cl.
728 s
= stab(str
, ST_CLASS
, ST_FIND
);
729 return s
!= NULL
&& bitnset(bitidx(cl
), s
->s_class
);