#include <sys_defs.h>
#include <msg.h>
#include <mymalloc.h>
#include <vstring.h>
#include <ctable.h>
#include <stringops.h>
#include <split_at.h>
#include <rewrite_clnt.h>
#include <resolve_clnt.h>
#include <mail_proto.h>
#include <smtpd_resolve.h>
static CTABLE *smtpd_resolve_cache;
#define STR(x) vstring_str(x)
#define SENDER_ADDR_JOIN_CHAR '\n'
static void *resolve_pagein(const char *sender_plus_addr, void *unused_context)
{
const char myname[] = "resolve_pagein";
static VSTRING *query;
static VSTRING *junk;
static VSTRING *sender_buf;
RESOLVE_REPLY *reply;
const char *sender;
const char *addr;
if (query == 0) {
query = vstring_alloc(10);
junk = vstring_alloc(10);
sender_buf = vstring_alloc(10);
}
reply = (RESOLVE_REPLY *) mymalloc(sizeof(*reply));
resolve_clnt_init(reply);
vstring_strcpy(junk, sender_plus_addr);
sender = STR(junk);
if ((addr = split_at(STR(junk), SENDER_ADDR_JOIN_CHAR)) == 0)
msg_panic("%s: bad search key: \"%s\"", myname, sender_plus_addr);
rewrite_clnt_internal(MAIL_ATTR_RWR_LOCAL, sender, sender_buf);
rewrite_clnt_internal(MAIL_ATTR_RWR_LOCAL, addr, query);
resolve_clnt_query_from(STR(sender_buf), STR(query), reply);
vstring_strcpy(junk, STR(reply->recipient));
casefold(reply->recipient, STR(junk));
return ((void *) reply);
}
static void resolve_pageout(void *data, void *unused_context)
{
RESOLVE_REPLY *reply = (RESOLVE_REPLY *) data;
resolve_clnt_free(reply);
myfree((void *) reply);
}
void smtpd_resolve_init(int cache_size)
{
if (smtpd_resolve_cache)
ctable_free(smtpd_resolve_cache);
smtpd_resolve_cache = ctable_create(cache_size, resolve_pagein,
resolve_pageout, (void *) 0);
}
const RESOLVE_REPLY *smtpd_resolve_addr(const char *sender, const char *addr)
{
static VSTRING *sender_plus_addr_buf;
if (sender_plus_addr_buf == 0)
sender_plus_addr_buf = vstring_alloc(10);
if (smtpd_resolve_cache == 0)
msg_panic("smtpd_resolve_addr: missing initialization");
vstring_sprintf(sender_plus_addr_buf, "%s%c%s",
sender ? sender : RESOLVE_NULL_FROM,
SENDER_ADDR_JOIN_CHAR, addr);
return (const RESOLVE_REPLY *)
ctable_locate(smtpd_resolve_cache, STR(sender_plus_addr_buf));
}