$[image,routine,argument] 格式的替换是特殊处理的。image、routine、argument 部分用于查找和调用由用户提供的例程。在 UNIX 上运行时,MTA 使用 dlopen 和 dlsym 从共享库 image 中动态装入和调用 routine 例程。然后使用以下参数列表将 routine 例程作为函数调用:
status = routine (argument, arglength, result, reslength) |
argument 和 result 是长度为 252 字节的字符串缓冲区。argument 和 result 将作为指针传递至字符串(例如,在 C 中,作为 char*)。arglength 和 reslength 是由引用传递的带有符号的长整数。输入时,argument 包含来自映射表模板的 argument 字符串,arglength 包含该字符串的长度。返回时,结果字符串应放在 result 中,其长度应放在 reslength 中。然后,此结果字符串将替换映射表模板中的 $[image,routine,argument]。如果映射表替换失败,则 routine 例程应返回 0;如果映射表替换成功,则该例程应返回 -1。如果替换失败,则正常情况下,原始输入字符串将原样用作输出字符串。
如果要在执行由站点提供的例程替换的映射表条目中使用进程控制元字符(例如,$C、$R 或 $L),应将进程控制元字符置于映射表模板中由站点提供的例程替换的左侧;否则,映射表替换的“失败”将导致不显示进程控制元字符。
由站点提供的例程调用机制可以使用各种复杂的方式来扩展 MTA 的映射进程。例如,在 PORT_ACCESS 或 ORIG_SEND_ACCESS 映射表中,可以调用某些类型的装入监视服务,其结果可用于确定是否接受连接或邮件。
由站点提供的共享库映像 image 应可由所有用户读取。