David B?rgin: > On 14/01/2020 18:22, Wietse Venema wrote: > >> In section ?What macros will Postfix send to Milters??, MILTER_README > >> says: > >> > >>> As of Sendmail 8.14.0, Milter applications can specify what macros > >>> they want to receive at different Milter protocol stages. An > >>> application-specified list takes precedence over a Postfix-specified > >>> list. > >> > >> This refers to the API function smfi_setsymlist, right? When I hook a > > > > The Milter docs say: "This function must only be called during > > xxfi_negotiate()". Thus, you cannot call it at any other time. > > (found with a Google query, because milter.org is gone). > > Yes, I?m using the API correctly, and get the MI_SUCCESS return code. > > > Postfix test code calls smfi_setsymlist during initial Milter > > connection negotiation, through the xxfi_negotiate callback in the > > smfiDesc structure. It's been ~10 years, but that code presumably > > worked. The program is included with Postfix source as > > src/milter/test_milter.c. Maybe you can play with that. > > I suspect this code doesn?t work and perhaps never did work ? in Postfix > source there is only one occurrence of smfi_setsymlist, in a code path > that is never executed.
smfi_setsymlist() is called by test_negotiate(): static 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) { if (set_macro_list) { if (verbose) printf("set symbol list %s to \"%s\"\n", macro_states[set_macro_state], set_macro_list); smfi_setsymlist(ctx, set_macro_state, set_macro_list); ... } test_negotiate() is referenced in: static struct smfiDesc smfilter = { "test-milter", SMFI_VERSION, SMFIF_ADDRCPT | SMFIF_DELRCPT | SMFIF_ADDHDRS | SMFIF_CHGHDRS | SMFIF_CHGBOD Y | SMFIF_CHGFROM, test_connect, ... #if SMFI_VERSION > 5 test_negotiate, #endif }; Which is in turn referenced at the end of the test-milter main program. if (smfi_register(smfilter) == MI_FAILURE) { fprintf(stderr, "smfi_register failed\n"); exit(1); } return (smfi_main()); } I can lead the horse to the water,. but I cannot force it to drink. Wietse