91 static int transport_match_parent_style;
93 #define STR(x) vstring_str(x)
100 const char *transport_maps)
120 transport_wildcard_init(tp);
138 static void update_entry(
const char *new_channel,
const char *new_nexthop,
139 const char *rcpt_domain,
VSTRING *channel,
148 if (*new_channel == 0) {
149 if (*new_nexthop != 0)
159 if (*new_nexthop != 0)
171 static void parse_transport_entry(
const char *value,
const char *rcpt_domain,
189 update_entry(saved_value, host ? host :
"", rcpt_domain, channel, nexthop);
223 #define PARTIAL DICT_FLAG_FIXED
226 parse_transport_entry(value,
"", channel, nexthop);
231 msg_info(
"wildcard_{chan:hop}={%s:%s}",
246 const char *rcpt_domain,
252 #define STREQ(x,y) (strcmp((x), (y)) == 0)
253 #define DISCARD_EXTENSION ((char **) 0)
259 msg_warn(
"transport_lookup: null address - skipping table lookup");
268 #define LOOKUP_STRATEGY \
269 (MA_FIND_FULL | MA_FIND_NOEXT | MA_FIND_DOMAIN | \
270 (transport_match_parent_style == MATCH_FLAG_PARENT ? \
271 MA_FIND_PDMS : MA_FIND_PDDMDS))
273 if ((ratsign = strrchr(addr,
'@')) == 0 || ratsign[1] == 0)
274 msg_panic(
"transport_lookup: bad address: \"%s\"", addr);
278 parse_transport_entry(value, rcpt_domain, channel, nexthop);
288 transport_wildcard_init(tp);
294 rcpt_domain, channel, nexthop);
317 static NORETURN usage(
const char *progname)
319 msg_fatal(
"usage: %s [-v] database", progname);
322 int main(
int argc,
char **argv)
331 char *expect_channel;
332 char *expect_nexthop;
340 while ((ch =
GETOPT(argc, argv,
"v")) > 0) {
349 if (argc != optind + 1)
355 #define UPDATE(var, val) do { myfree(var); var = mystrdup(val); } while (0)
373 if ((addr_field =
mystrtok(&bp,
":")) == 0)
375 if ((rcpt_domain = strrchr(addr_field,
'@')) == 0)
378 expect_channel =
mystrtok(&bp,
":");
379 expect_nexthop =
mystrtok(&bp,
":");
380 if ((expect_channel != 0) != (expect_nexthop != 0))
381 msg_fatal(
"specify both channel and nexthop, or specify neither");
382 if (expect_channel) {
383 if (strcmp(expect_channel,
"-") == 0)
385 if (strcmp(expect_nexthop,
"-") == 0)
391 msg_fatal(
"garbage after nexthop field");
402 if (expect_nexthop && status) {
404 addr_field, rcpt_domain,
405 STR(channel),
STR(nexthop));
407 if (strcmp(expect_channel,
STR(channel)) != 0) {
408 msg_warn(
"expect channel '%s' but got '%s'",
409 expect_channel,
STR(channel));
412 if (strcmp(expect_nexthop,
STR(nexthop)) != 0) {
413 msg_warn(
"expect nexthop '%s' but got '%s'",
414 expect_nexthop,
STR(nexthop));
417 }
else if (expect_nexthop && !status) {
420 "(try again)" :
"(not found)");
422 msg_warn(
"expect channel '%s' but got none", expect_channel);
423 msg_warn(
"expect nexthop '%s' but got none", expect_nexthop);
425 }
else if (!status) {
428 "(try again)" :
"(not found)");
#define vstring_fgets_nonl(s, p)
VSTRING * wildcard_nexthop
TRANSPORT_INFO * transport_pre_init(const char *transport_maps_name, const char *transport_maps)
int match_parent_style(const char *name)
char * mystrdup(const char *str)
#define MAIL_SERVICE_ERROR
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
#define DICT_FLAG_UTF8_REQUEST
char * mystrtok(char **src, const char *sep)
#define DICT_FLAG_FOLD_FIX
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
void mail_conf_read(void)
void transport_post_init(TRANSPORT_INFO *tp)
#define VAR_TRANSPORT_MAPS
int transport_lookup(TRANSPORT_INFO *tp, const char *addr, const char *rcpt_domain, VSTRING *channel, VSTRING *nexthop)
MAPS * maps_create(const char *title, const char *map_names, int dict_flags)
VSTREAM * vstream_printf(const char *fmt,...)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
VSTRING * wildcard_channel
NORETURN msg_fatal(const char *fmt,...)
MAPS * maps_free(MAPS *maps)
int vstream_fflush(VSTREAM *stream)
#define MAIL_SERVICE_RETRY
#define GETOPT(argc, argv, str)
VSTRING * vstring_free(VSTRING *vp)
#define DICT_FLAG_NO_REGSUB
char * split_at(char *string, int delimiter)
#define mail_addr_find_strategy(maps, address, extension, strategy)
const char * maps_find(MAPS *maps, const char *name, int flags)
void transport_free(TRANSPORT_INFO *tp)
void * mymalloc(ssize_t len)
void msg_info(const char *fmt,...)