If someone wants to try … Make sure you have libmilter installed. Compile and run:
c99 -Wall nosetsymlist.c -lmilter -o nosetsymlist ./nosetsymlist Enable in /etc/postfix/main.cf with: smtpd_milters = inet:localhost:3000 Then both requested macros, _ and {client_port}, are *not* available during connect. If I request these macros in /etc/postfix/main.cf with milter_connect_macros = _ {client_port} then they *are* available and do get printed. Either smfi_setsymlist doesn’t do anything, or – perhaps more likely – I’m making a mistake! Very grateful for any hints. #include <stdio.h> #include <assert.h> #include "libmilter/mfapi.h" sfsistat test_negotiate( SMFICTX *ctx, unsigned long f0, unsigned long f1, unsigned long f2, unsigned long f3, unsigned long *pf0, unsigned long *pf1, unsigned long *pf2, unsigned long *pf3 ) { *pf0 = *pf1 = *pf2 = *pf3 = 0; int status = smfi_setsymlist(ctx, SMFIM_CONNECT, "_ {client_port}"); assert(status == MI_SUCCESS); return SMFIS_CONTINUE; } sfsistat test_connect(SMFICTX *ctx, char *hostname, struct sockaddr *hostaddr) { char *_macro = smfi_getsymval(ctx, "_"); printf("_: %s\n", _macro == NULL ? "NULL" : _macro); char *cpmacro = smfi_getsymval(ctx, "{client_port}"); printf("{client_port}: %s\n", cpmacro == NULL ? "NULL" : cpmacro); return SMFIS_CONTINUE; } int main() { int connstatus = smfi_setconn("inet:3000@localhost"); assert(connstatus == MI_SUCCESS); int regstatus = smfi_register((struct smfiDesc) { .xxfi_name = "nosetsymlist", .xxfi_version = SMFI_VERSION, .xxfi_connect = test_connect, .xxfi_negotiate = test_negotiate, }); assert(regstatus == MI_SUCCESS); return smfi_main(); }