diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-17 20:23:14 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-17 20:23:14 +0000 |
commit | 14cb4d917abdc9912bd16a199b0023330500c951 (patch) | |
tree | 3ba0c2326d4c9cf89066d5ab1509c6269527d811 /pmult | |
parent | 206d038a3aa08f59cbbe29344e96ecb88e3e32a3 (diff) | |
download | mailfromd-14cb4d917abdc9912bd16a199b0023330500c951.tar.gz mailfromd-14cb4d917abdc9912bd16a199b0023330500c951.tar.bz2 |
Document and improve pmult.
* pmult/pmult.c (debug_level): Remove.
(struct pmult_priv_data): Remove debug. Use pmult_debug instead.
(macro_trans): Define Sendmail compatibility macros cn_issuer and
cn_subject.
(builtin_macros): Fix typo in "multiplexer".
(define_macros): Rewrite. The "define-macros" statement takes
exactly two arguments, each of which can be either a string or a
list of strings.
* doc/values.texi, doc/mailfromd.texi, doc/pmult.texi: Update.
* doc/Makefile.am (check-fixmes): Scan all texinfo documents.
git-svn-id: file:///svnroot/mailfromd/trunk@1756 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'pmult')
-rw-r--r-- | pmult/pmult.c | 242 |
1 files changed, 120 insertions, 122 deletions
diff --git a/pmult/pmult.c b/pmult/pmult.c index f5c4efea..8963fca5 100644 --- a/pmult/pmult.c +++ b/pmult/pmult.c @@ -47,7 +47,6 @@ const char *package_bugreport = "<" PACKAGE_BUGREPORT ">"; char *portspec; /* Communication socket */ int log_to_stderr; /* Use stderr for logging */ char *log_tag; /* override mu_log_tag */ -mu_log_level_t debug_level; /* Debug verbosity level */ mu_debug_t pmult_debug; /* Debugging object */ unsigned pmilter_debug_level; static pthread_mutex_t pmult_debug_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -82,7 +81,6 @@ enum pmult_msg_state struct pmult_priv_data { - mu_debug_t debug; mu_list_t /* of gacopyz_srv_t */ srvlist; pthread_mutex_t mutex; char *seid; @@ -133,6 +131,9 @@ struct mu_kwd macro_trans[] = { { "tls_cn_subject", PMM_TLS_CN_SUBJECT }, { "tls_cn_issuer", PMM_TLS_CN_ISSUER }, + { "cn_issuer", PMM_TLS_CN_ISSUER }, + { "cn_subject", PMM_TLS_CN_SUBJECT }, + { "auth_type", PMM_AUTH_TYPE }, { "auth_authen", PMM_AUTH_AUTHEN }, { "auth_author", PMM_AUTH_AUTHOR }, @@ -184,7 +185,7 @@ macro_defined(uint32_t *tab, uint count, uint32_t macro) } static char *builtin_macros[] = { - "multiplexor", "pmult", + "multiplexer", "pmult", "mult_version", PACKAGE_VERSION, NULL }; @@ -477,7 +478,8 @@ static int _cb_debug (mu_debug_t debug, void *data, mu_config_value_t *arg) { int rc; - + int debug_level; + if (mu_cfg_assert_value_type (arg, MU_CFG_STRING, debug)) return 1; rc = mu_debug_level_from_string (arg->v.string, &debug_level, debug); @@ -489,98 +491,101 @@ _cb_debug (mu_debug_t debug, void *data, mu_config_value_t *arg) return 0; } -static int -define_macros (mu_debug_t debug, - const char *stage_name, size_t argc, mu_config_value_t *argv) + +struct macro_slot { - int stage; - uint i, j; + uint stage; + uint num; +}; + +int +define_single_macro (mu_debug_t debug, const char *string, void *data) +{ + struct macro_slot *slot = data; + int macro; - if (mu_kwd_xlat_name (meta_stage_trans, stage_name, &stage)) + if (mu_kwd_xlat_name (macro_trans, string, ¯o)) { - mu_cfg_format_error (debug, MU_DEBUG_ERROR, _("Unknown SMTP stage")); + mu_cfg_format_error (debug, MU_DEBUG_ERROR, + _("Unknown MeTA1 macro %s"), + string); return 1; } - for (i = 0; i < PM_MAX_MACROS && macrotab[stage][i] != PMM_END; i++) - ; - - for (j = 0; j < argc; j++) + switch (macro) { - int macro; - - if (mu_cfg_assert_value_type (&argv[j], MU_CFG_STRING, debug)) - return 1; - - if (i == PM_MAX_MACROS) + case PMM_MAIL_TAID: + if (slot->stage < PM_SMST_MAIL) { mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("Too many macros defined (at %s, max. %d)"), - argv[j].v.string, PM_MAX_MACROS); - break; - } - - if (mu_kwd_xlat_name (macro_trans, argv[j].v.string, ¯o)) - { - mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("Unknown MeTA1 macro %s"), - argv[j].v.string); - continue; + _("Macro \"taid\" cannot be requested " + "at this stage")); + return 1; } + break; - switch (macro) - { - case PMM_MAIL_TAID: - if (stage < PM_SMST_MAIL) - { - mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("Macro \"taid\" cannot be requested " - "at this stage")); - continue; - } - break; - - case PMM_DOT_MSGID: - if (stage != PM_SMST_DOT) - { - mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("Macro \"msgid\" cannot be requested " - "at this stage")); - continue; - } - } - - if (macro_defined (macrotab[stage], i, macro)) - { - mu_debug_printf (debug, MU_DIAG_WARNING, - _("Macro %s already defined\n"), - argv[j].v.string); - continue; - } - macrotab[stage][i] = macro; - if (mu_kwd_xlat_tok (macro_trans, macro, - (const char**) ¯onames[stage][i])) + case PMM_DOT_MSGID: + if (slot->stage != PM_SMST_DOT) { mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("INTERNAL ERROR at %s:%d"), - __FILE__, __LINE__); - exit (EX_SOFTWARE); + _("Macro \"msgid\" cannot be requested " + "at this stage")); + return 1; } - i++; } - macrotab[stage][i] = PMM_END; - macronames[stage][i] = NULL; + + if (macro_defined (macrotab[slot->stage], slot->num, macro)) + { + mu_debug_printf (debug, MU_DIAG_WARNING, + _("Macro %s already defined\n"), + string); + return 1; + } + macrotab[slot->stage][slot->num] = macro; + if (mu_kwd_xlat_tok (macro_trans, macro, + (const char**) ¯onames[slot->stage][slot->num])) + { + mu_cfg_format_error (debug, MU_DEBUG_ERROR, + _("INTERNAL ERROR at %s:%d"), + __FILE__, __LINE__); + exit (EX_SOFTWARE); + } + slot->num++; return 0; } +static int +define_macros (mu_debug_t debug, const char *stage_name, + mu_config_value_t *arg) +{ + int rc; + uint i; + struct macro_slot slot; + + if (mu_kwd_xlat_name (meta_stage_trans, stage_name, &slot.stage)) + { + mu_cfg_format_error (debug, MU_DEBUG_ERROR, _("Unknown SMTP stage")); + return 1; + } + + for (i = 0; i < PM_MAX_MACROS && macrotab[slot.stage][i] != PMM_END; i++) + ; + slot.num = i; + rc = mu_cfg_string_value_cb (debug, arg, define_single_macro, &slot); + macrotab[slot.stage][slot.num] = PMM_END; + macronames[slot.stage][slot.num] = NULL; + return rc; +} + struct define_closure { int retcode; mu_debug_t debug; - size_t argc; - mu_config_value_t *argv; + mu_config_value_t *arg; }; + + static int define_macros_iter (void *item, void *data) { @@ -590,8 +595,7 @@ define_macros_iter (void *item, void *data) if (mu_cfg_assert_value_type (arg, MU_CFG_STRING, clos->debug)) clos->retcode = 1; else - clos->retcode |= define_macros (clos->debug, arg->v.string, - clos->argc, clos->argv); + clos->retcode |= define_macros (clos->debug, arg->v.string, clos->arg); return 0; } @@ -606,23 +610,28 @@ _cb_define (mu_debug_t debug, void *data, mu_config_value_t *arg) if (arg->v.arg.c < 2) { mu_cfg_format_error (debug, MU_DEBUG_ERROR, - _("Not enough arguments to define-macro")); + _("Not enough arguments to define-macros")); return 1; } - + else if (arg->v.arg.c > 2) + { + mu_cfg_format_error (debug, MU_DEBUG_ERROR, + _("Too many arguments to define-macros")); + return 1; + } + switch (arg->v.arg.v[0].type) { case MU_CFG_STRING: rc = define_macros (debug, arg->v.arg.v[0].v.string, - arg->v.arg.c - 1, arg->v.arg.v + 1); + &arg->v.arg.v[1]); break; case MU_CFG_LIST: dc.retcode = 0; dc.debug = debug; - dc.argc = arg->v.arg.c - 1; - dc.argv = arg->v.arg.v + 1; + dc.arg = &arg->v.arg.v[1]; mu_list_do (arg->v.arg.v[0].v.list, define_macros_iter, &dc); rc = dc.retcode; break; @@ -677,7 +686,7 @@ struct mu_cfg_param pmult_cfg_param[] = { N_("Write PID to this file.") }, { "auth-macros", mu_cfg_bool, &want_auth_macros, 0, NULL, N_("Pass auth macros to MAIL handler.") }, - { "define-macro", mu_cfg_callback, NULL, 0, _cb_define, + { "define-macros", mu_cfg_callback, NULL, 0, _cb_define, N_("Define macros for the given SMTP stage."), N_("stage: string> <macros: strings") }, { NULL } @@ -947,7 +956,7 @@ cb_reply (gacopyz_srv_t gsrv, int cmd, int rcmd, void *data) break; } cp++; - PMU_DEBUG4 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG4 (pmult_debug, MU_DEBUG_TRACE2, "%s=%u '%s','%s'\n", hdrcommname (rcmd), idx, buf, cp); @@ -972,7 +981,7 @@ cb_reply (gacopyz_srv_t gsrv, int cmd, int rcmd, void *data) type = (*cp == 0) ? SM_HDRMOD_T_REMOVE : SM_HDRMOD_T_REPLACE; if (get_mod_index (p, buf, idx, &index)) { - PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, + PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, "no such header: %s\n", buf); return 0; } @@ -1038,7 +1047,7 @@ pmult_std_reply (struct pmult_priv_data *p, pmse_ctx_P pmse_ctx, case SMFIR_REPLYCODE: gacopyz_srv_reply (gsrv, &buf, &size); - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, reply=%s\n", ident, arg, buf); tmp = trailcrlf (&buf); @@ -1048,33 +1057,33 @@ pmult_std_reply (struct pmult_priv_data *p, pmse_ctx_P pmse_ctx, return status; case SMFIR_ACCEPT: - PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, accept\n", ident, arg); return SMTP_R_ACCEPT; case SMFIR_REJECT: - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, reply=%s\n", ident, arg, MSG_REJECT); SM_VERBOSE (sm_pmfi_setreply (pmse_ctx, MSG_REJECT)); return SMTP_R_PERM; case SMFIR_DISCARD: - PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, discard\n", ident, arg); return SMTP_R_DISCARD; case SMFIR_TEMPFAIL: - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, reply=%s\n", ident, arg, MSG_TEMPFAIL); SM_VERBOSE (sm_pmfi_setreply (pmse_ctx, MSG_TEMPFAIL)); return SMTP_R_TEMP; case SMFIR_SHUTDOWN: - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, reply=%s\n", ident, arg, MSG_SHUTDOWN); SM_VERBOSE (sm_pmfi_setreply (pmse_ctx, MSG_SHUTDOWN)); @@ -1082,7 +1091,7 @@ pmult_std_reply (struct pmult_priv_data *p, pmse_ctx_P pmse_ctx, case SMFIR_ADDRCPT: gacopyz_srv_reply (gsrv, &buf, &size); - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, addrcpt=%s\n", ident, arg, buf); SM_VERBOSE (sm_pmfi_rcpt_add (pmse_ctx, buf, NULL)); @@ -1090,7 +1099,7 @@ pmult_std_reply (struct pmult_priv_data *p, pmse_ctx_P pmse_ctx, case SMFIR_DELRCPT: gacopyz_srv_reply (gsrv, &buf, &size); - PMU_DEBUG3 (p->debug, MU_DEBUG_TRACE2, + PMU_DEBUG3 (pmult_debug, MU_DEBUG_TRACE2, "%s=%s, delrcpt=%s\n", ident, arg, buf); /* FIXME: Index is always 0. Should it be 1? */ @@ -1175,7 +1184,6 @@ pmult_free (struct pmult_priv_data *p) mu_stream_destroy (&p->hdrstream, NULL); mu_header_destroy (&p->hdr, mu_header_get_owner (p->hdr)); - mu_debug_destroy (&p->debug, NULL); pthread_mutex_destroy (&p->mutex); free (p); } @@ -1257,7 +1265,6 @@ pmult_connect (pmse_ctx_P pmse_ctx, const char *hostname, { mu_iterator_t itr; struct pmult_priv_data *p; - mu_debug_t dbg = NULL; int status = SMTP_R_CONT; int rc; char *tmp = NULL; @@ -1265,16 +1272,10 @@ pmult_connect (pmse_ctx_P pmse_ctx, const char *hostname, char **kv; char buf[INT_BUFSIZE_BOUND (uintmax_t)]; - if (debug_level) - { - mu_debug_create (&dbg, NULL); - mu_debug_set_level (dbg, debug_level); - } - - if (mu_debug_check_level (dbg, MU_DEBUG_TRACE1)) + if (mu_debug_check_level (pmult_debug, MU_DEBUG_TRACE1)) { char *p = mu_sockaddr_to_astr (&hostaddr->sa, sizeof *hostaddr); - __PMU_DEBUG2 (dbg, MU_DEBUG_TRACE1, + __PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "Connect from: %s, address %s\n", hostname, p); free (p); } @@ -1283,10 +1284,8 @@ pmult_connect (pmse_ctx_P pmse_ctx, const char *hostname, if (!p) { mu_error ("%s: accept", mu_strerror (ENOMEM)); - mu_debug_destroy (&dbg, NULL); return SMTP_R_ACCEPT; } - p->debug = dbg; pthread_mutex_init (&p->mutex, NULL); kv = translate_macros0 (pmse_ctx, p, PM_SMST_CONNECT, 0); @@ -1297,7 +1296,6 @@ pmult_connect (pmse_ctx_P pmse_ctx, const char *hostname, if (rc) { mu_error ("%smu_list_create: %s", PRIV_SEID_C (p), mu_strerror (rc)); - mu_debug_destroy (&dbg, NULL); free (p); return SMTP_R_ACCEPT; } @@ -1367,7 +1365,7 @@ pmult_close (pmse_ctx_P pmse_ctx) struct pmult_priv_data *p = sm_pmfi_get_ctx_se (pmse_ctx); if (p) { - PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, "%sClosing connection\n", + PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, "%sClosing connection\n", PRIV_SEID_C (p)); pmult_shutdown (pmse_ctx, p); } @@ -1389,7 +1387,7 @@ pmult_helo (pmse_ctx_P pmse_ctx, const char *helohost, bool ehlo) struct pmult_priv_data *p = sm_pmfi_get_ctx_se (pmse_ctx); char **kv = translate_macros (pmse_ctx, PM_SMST_EHLO, 1); - PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE1, "%sHELO %s\n", + PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "%sHELO %s\n", PRIV_SEID_C (p), helohost); kv[0] = "s"; kv[1] = (char*) helohost; @@ -1426,17 +1424,17 @@ pmult_mail (pmse_ctx_P pmse_ctx, const char *mail, char **argv) struct env_arg x; sfsistat_T status; - if (mu_debug_check_level (p->debug, MU_DEBUG_TRACE1)) + if (mu_debug_check_level (pmult_debug, MU_DEBUG_TRACE1)) { int i; - __PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE1, "%sMAIL FROM: %s", + __PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "%sMAIL FROM: %s", PRIV_SEID_C (p), mail); if (argv) { for (i = 0; argv[i]; i++) - __PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, " %s", argv[i]); + __PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, " %s", argv[i]); } - PMU_DEBUG (p->debug, MU_DEBUG_TRACE1, "\n"); + PMU_DEBUG (pmult_debug, MU_DEBUG_TRACE1, "\n"); } /* Fill in the macro array */ @@ -1450,7 +1448,7 @@ pmult_mail (pmse_ctx_P pmse_ctx, const char *mail, char **argv) mu_address_destroy (&addr); } kv[2] = "ntries"; - kv[3] = "0"; + kv[3] = "1"; kv[4] = "nrcpts"; kv[5] = "0"; kv[6] = "nbadrcpts"; @@ -1547,23 +1545,23 @@ pmult_rcpt (pmse_ctx_P pmse_ctx, const char *rcpt, char **argv) char buf1[INT_BUFSIZE_BOUND (uintmax_t)]; char buf2[INT_BUFSIZE_BOUND (uintmax_t)]; - if (mu_debug_check_level (p->debug, MU_DEBUG_TRACE1)) + if (mu_debug_check_level (pmult_debug, MU_DEBUG_TRACE1)) { int i; - __PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE1, "%sRCPT TO: %s", + __PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "%sRCPT TO: %s", PRIV_SEID_C (p), rcpt); if (argv) { for (i = 0; argv[i]; i++) - __PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, " %s", argv[i]); + __PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, " %s", argv[i]); } - PMU_DEBUG (p->debug, MU_DEBUG_TRACE1, "\n"); + PMU_DEBUG (pmult_debug, MU_DEBUG_TRACE1, "\n"); } p->nrcpt++; if (parse_email_addr (rcpt, &sender, &addr, &host)) { - PMU_DEBUG2 (p->debug, MU_DEBUG_ERROR, "%sbad recipient address %s", + PMU_DEBUG2 (pmult_debug, MU_DEBUG_ERROR, "%sbad recipient address %s", PRIV_SEID_C (p), rcpt); p->nbadrcpts++; return SMTP_R_CONT; /* eh? */ @@ -1628,7 +1626,7 @@ pmult_data (pmse_ctx_P pmse_ctx) { struct pmult_priv_data *p = sm_pmfi_get_ctx_se (pmse_ctx); char **kv = translate_macros (pmse_ctx, PM_SMST_DATA, 4); - PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, "%sDATA\n", PRIV_SEID_C (p)); + PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, "%sDATA\n", PRIV_SEID_C (p)); return pmult_runlist (p, rf_data, pmse_ctx, NULL, kv); } @@ -1637,7 +1635,7 @@ static sfsistat_T pmult_unknown (pmse_ctx_P pmse_ctx, const char *cmd) { struct pmult_priv_data *p = sm_pmfi_get_ctx_se (pmse_ctx); - PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE1, "%sUnknown command %s\n", + PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "%sUnknown command %s\n", PRIV_SEID_C (p), cmd); return SMTP_R_CONT; } @@ -1656,7 +1654,7 @@ pmult_abort (pmse_ctx_P pmse_ctx) struct pmult_priv_data *p = sm_pmfi_get_ctx_se (pmse_ctx); if (p) { - PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, "%sABORT\n", PRIV_SEID_C (p)); + PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, "%sABORT\n", PRIV_SEID_C (p)); pmult_runlist (p, rf_abort, pmse_ctx, NULL, NULL); pmult_clear (p); } @@ -1865,11 +1863,11 @@ pmult_msg_handler (pmse_ctx_P pmse_ctx, unsigned char *buf, size_t len) if (p) { - if (mu_debug_check_level (p->debug, MU_DEBUG_TRACE7)) - __PMU_DEBUG4 (p->debug, MU_DEBUG_TRACE1, "%sBODY %lu %.*s\n", + if (mu_debug_check_level (pmult_debug, MU_DEBUG_TRACE7)) + __PMU_DEBUG4 (pmult_debug, MU_DEBUG_TRACE1, "%sBODY %lu %.*s\n", PRIV_SEID_C (p), (unsigned long) len, (int) len, buf); else - PMU_DEBUG2 (p->debug, MU_DEBUG_TRACE1, "%sBODY %lu\n", + PMU_DEBUG2 (pmult_debug, MU_DEBUG_TRACE1, "%sBODY %lu\n", PRIV_SEID_C (p), (unsigned long) len); } else @@ -1925,7 +1923,7 @@ pmult_eom (pmse_ctx_P pmse_ctx) struct body_chunk bc; sfsistat_T rc; - PMU_DEBUG1 (p->debug, MU_DEBUG_TRACE1, "%sEOM\n", PRIV_SEID_C (p)); + PMU_DEBUG1 (pmult_debug, MU_DEBUG_TRACE1, "%sEOM\n", PRIV_SEID_C (p)); bc.ident = "eom"; bc.srvfun = gacopyz_srv_eom; bc.size = 0; |