diff -bru postfix-2.0.18/src/global/mail_params.c postfix-2.0.18-sender_relay/src/global/mail_params.c --- postfix-2.0.18/src/global/mail_params.c 2002-12-13 23:04:31.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/global/mail_params.c 2004-02-01 00:49:27.000000000 +0100 @@ -165,6 +165,7 @@ char *var_myorigin; char *var_mydest; char *var_relayhost; +char *var_relayhost_map; char *var_transit_origin; char *var_transit_dest; char *var_mail_name; @@ -433,6 +434,7 @@ VAR_MYDEST, DEF_MYDEST, &var_mydest, 0, 0, VAR_MYORIGIN, DEF_MYORIGIN, &var_myorigin, 1, 0, VAR_RELAYHOST, DEF_RELAYHOST, &var_relayhost, 0, 0, + VAR_RELAYHOST_MAP, DEF_RELAYHOST_MAP, &var_relayhost_map, 0, 0, VAR_PROGRAM_DIR, DEF_PROGRAM_DIR, &var_program_dir, 1, 0, VAR_DAEMON_DIR, DEF_DAEMON_DIR, &var_daemon_dir, 1, 0, VAR_COMMAND_DIR, DEF_COMMAND_DIR, &var_command_dir, 1, 0, diff -bru postfix-2.0.18/src/global/mail_params.h postfix-2.0.18-sender_relay/src/global/mail_params.h --- postfix-2.0.18/src/global/mail_params.h 2003-03-03 23:07:03.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/global/mail_params.h 2004-02-01 01:03:34.000000000 +0100 @@ -165,6 +165,10 @@ #define DEF_RELAYHOST "" extern char *var_relayhost; +#define VAR_RELAYHOST_MAP "relayhost_map" +#define DEF_RELAYHOST_MAP "" +extern char *var_relayhost_map; + #define VAR_FALLBACK_RELAY "fallback_relay" #define DEF_FALLBACK_RELAY "" extern char *var_fallback_relay; diff -bru postfix-2.0.18/src/global/resolve_clnt.h postfix-2.0.18-sender_relay/src/global/resolve_clnt.h --- postfix-2.0.18/src/global/resolve_clnt.h 2002-12-08 17:45:58.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/global/resolve_clnt.h 2004-02-04 17:33:10.000000000 +0100 @@ -31,6 +31,7 @@ #define RESOLVE_CLASS_VIRTUAL (1<<10) /* virtual_mailbox_domains */ #define RESOLVE_CLASS_RELAY (1<<11) /* relay_domains */ #define RESOLVE_CLASS_DEFAULT (1<<12) /* raise reject_unauth_destination */ +#define RESOLVE_CLASS_SMARTHOST (1<<13) /* delivery via smarthost choosen */ #define RESOLVE_CLASS_FINAL \ (RESOLVE_CLASS_LOCAL | RESOLVE_CLASS_ALIAS | RESOLVE_CLASS_VIRTUAL) diff -bru postfix-2.0.18/src/qmgr/qmgr.c postfix-2.0.18-sender_relay/src/qmgr/qmgr.c --- postfix-2.0.18/src/qmgr/qmgr.c 2002-12-22 20:31:18.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/qmgr/qmgr.c 2004-02-04 18:10:36.000000000 +0100 @@ -288,6 +288,8 @@ static QMGR_SCAN *qmgr_incoming; static QMGR_SCAN *qmgr_deferred; +MAPS *relayhost_map; + /* qmgr_deferred_run_event - queue manager heartbeat */ static void qmgr_deferred_run_event(int unused_event, char *dummy) @@ -431,6 +433,15 @@ } } +/* qmgr_pre_init - pre-jail initialization */ + +static void qmgr_pre_init(char *unused_name, char **unused_argv) +{ + relayhost_map = *var_relayhost_map ? + maps_create("relayhosts", var_relayhost_map, DICT_FLAG_LOCK) : + 0; +} + /* qmgr_post_init - post-jail initialization */ static void qmgr_post_init(char *unused_name, char **unused_argv) @@ -511,6 +522,7 @@ MAIL_SERVER_STR_TABLE, str_table, MAIL_SERVER_BOOL_TABLE, bool_table, MAIL_SERVER_TIME_TABLE, time_table, + MAIL_SERVER_PRE_INIT, qmgr_pre_init, MAIL_SERVER_POST_INIT, qmgr_post_init, MAIL_SERVER_LOOP, qmgr_loop, MAIL_SERVER_PRE_ACCEPT, pre_accept, diff -bru postfix-2.0.18/src/qmgr/qmgr.h postfix-2.0.18-sender_relay/src/qmgr/qmgr.h --- postfix-2.0.18/src/qmgr/qmgr.h 2002-12-08 02:19:01.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/qmgr/qmgr.h 2004-02-04 18:13:33.000000000 +0100 @@ -15,6 +15,11 @@ #include /* + * Global library. + */ +#include + + /* * The queue manager is built around lots of mutually-referring structures. * These typedefs save some typing. */ @@ -307,6 +312,11 @@ extern void qmgr_scan_request(QMGR_SCAN *, int); extern char *qmgr_scan_next(QMGR_SCAN *); + /* + * qmgr.c + */ +extern MAPS *relayhost_map; + /* LICENSE /* .ad /* .fi diff -bru postfix-2.0.18/src/qmgr/qmgr_message.c postfix-2.0.18-sender_relay/src/qmgr/qmgr_message.c --- postfix-2.0.18/src/qmgr/qmgr_message.c 2003-04-11 15:19:51.000000000 +0200 +++ postfix-2.0.18-sender_relay/src/qmgr/qmgr_message.c 2004-02-05 00:20:01.000000000 +0100 @@ -569,6 +569,20 @@ } /* + * Selected the proper server on basis of the sender's adress, + * if a smarthost was resolved as next hop. + */ + if (relayhost_map && (reply.flags & RESOLVE_CLASS_SMARTHOST)) { + const char * smarthost; + + if (smarthost = maps_find(relayhost_map, message->sender, 0)) { + msg_info("using smart host %s for sender %s", + smarthost, message->sender); + vstring_strcpy(reply.nexthop, smarthost); + } + } + + /* * XXX The nexthop destination is also used as lookup key for the * per-destination queue. Fold the nexthop to lower case so that we * don't have multiple queues for the same site. diff -bru postfix-2.0.18/src/trivial-rewrite/resolve.c postfix-2.0.18-sender_relay/src/trivial-rewrite/resolve.c --- postfix-2.0.18/src/trivial-rewrite/resolve.c 2003-01-12 00:52:41.000000000 +0100 +++ postfix-2.0.18-sender_relay/src/trivial-rewrite/resolve.c 2004-02-04 18:28:25.000000000 +0100 @@ -459,12 +459,14 @@ /* * With off-host delivery, relayhost overrides recipient domain. */ - if (*var_relayhost) + if (*var_relayhost) { vstring_strcpy(nexthop, var_relayhost); - else + *flags |= RESOLVE_CLASS_SMARTHOST; + } else { vstring_strcpy(nexthop, rcpt_domain); } } + } /* * Local delivery.