#include "httpd.h" #include "http_config.h" #include "apr_tables.h" #include "mod_smtpd.h" typedef struct rcpt_ok_config { int bEnabled; } rcpt_ok_config; module AP_MODULE_DECLARE_DATA smtpd_rcpt_ok_module; static smtpd_retcode default_rcpt(smtpd_session_rec *scr, char *address, apr_table_t *rcpt_param, smtpd_return_data **out_data) { rcpt_ok_config *pConfig = ap_get_module_config(scr->s->module_config, &smtpd_rcpt_ok_module); return (pConfig->bEnabled) ? SMTPD_OK : SMTPD_DECLINED; } static void *create_config(apr_pool_t *p, server_rec *s) { rcpt_ok_config *pConfig = apr_pcalloc(p, sizeof(*pConfig)); pConfig->bEnabled = 0; return pConfig; } static const char *set_module_status(cmd_parms *cmd, void *struct_ptr, int arg) { rcpt_ok_config *pConfig = ap_get_module_config(cmd->server->module_config, &smtpd_rcpt_ok_module); pConfig->bEnabled = arg ? 1 : 0; return NULL; } static const command_rec rcpt_ok_cmds[] = { AP_INIT_FLAG("SmtpRcptOk", set_module_status, NULL, RSRC_CONF, "Whether we are allowing all rcpts or not." "Default: Off"), { NULL } }; // registers httpd hooks static void register_hooks (apr_pool_t *p) { smtpd_hook_rcpt(default_rcpt, NULL, NULL, APR_HOOK_LAST); } module AP_MODULE_DECLARE_DATA smtpd_rcpt_ok_module = { STANDARD20_MODULE_STUFF, NULL, // create per-directory config structure NULL, // merge per-directory config structures create_config, NULL, // merge per-server config structures rcpt_ok_cmds, register_hooks // register hooks };