139 static time_t last_expire;
160 const char *myname =
"resolve_clnt";
168 if (last_addr == 0) {
179 #define STR vstring_str
182 msg_panic(
"%s: result clobbers input", myname);
187 #define IFSET(flag, text) ((reply->flags & (flag)) ? (text) : "")
189 if (time((time_t *) 0) < last_expire
190 && *addr && strcmp(addr,
STR(last_addr)) == 0
191 && strcmp(
class,
STR(last_class)) == 0
192 && strcmp(sender,
STR(last_sender)) == 0) {
198 msg_info(
"%s: cached: `%s' -> `%s' -> transp=`%s' host=`%s' rcpt=`%s' flags=%s%s%s%s class=%s%s%s%s%s",
218 if (rewrite_clnt_stream == 0)
241 if (
msg_verbose || count > 1 || (errno && errno != EPIPE && errno != ENOENT))
242 msg_warn(
"problem talking to service %s: %m",
246 msg_info(
"%s: `%s' -> `%s' -> transp=`%s' host=`%s' rcpt=`%s' flags=%s%s%s%s class=%s%s%s%s%s",
259 if (server_flags != 0)
262 msg_warn(
"%s: null transport result for: <%s>", myname, addr);
264 msg_warn(
"%s: null recipient result for: <%s>", myname, addr);
282 last_expire = time((time_t *) 0) + 30;
304 msg_fatal(
"usage: %s [-v] [address...]", myname);
307 static void resolve(
char *
class,
char *addr,
RESOLVE_REPLY *reply)
309 struct RESOLVE_FLAG_TABLE {
313 struct RESOLVE_FLAG_TABLE resolve_flag_table[] = {
325 struct RESOLVE_FLAG_TABLE *fp;
338 for (fp = resolve_flag_table; fp->name; fp++) {
339 if (reply->
flags & fp->flag) {
341 reply->
flags &= ~fp->flag;
344 if (reply->
flags != 0)
351 int main(
int argc,
char **argv)
364 while ((ch =
GETOPT(argc, argv,
"v")) > 0) {
376 while (argv[optind] && argv[optind + 1]) {
377 resolve(argv[optind], argv[optind + 1], &reply);
385 if (*
STR(buffer) == 0)
386 msg_fatal(
"need as input: class [address]");
389 resolve(
STR(buffer), addr, &reply);
#define vstring_fgets_nonl(s, p)
#define RESOLVE_FLAG_FAIL
#define RESOLVE_NULL_FROM
VSTREAM * clnt_stream_access(CLNT_STREAM *clnt_stream)
NORETURN msg_panic(const char *fmt,...)
CLNT_STREAM * rewrite_clnt_stream
int main(int argc, char **argv)
#define RECV_ATTR_INT(name, val)
void resolve_clnt_free(RESOLVE_REPLY *reply)
#define RESOLVE_FLAG_ROUTED
#define RESOLVE_CLASS_VIRTUAL
VSTRING * vstring_strcpy(VSTRING *vp, const char *src)
void mail_conf_read(void)
#define MAIL_ATTR_TRANSPORT
#define RESOLVE_CLASS_LOCAL
#define RESOLVE_FLAG_ERROR
void resolve_clnt_init(RESOLVE_REPLY *reply)
CLNT_STREAM * clnt_stream_create(const char *class, const char *service, int timeout, int ttl)
VSTREAM * vstream_printf(const char *fmt,...)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
char * var_rewrite_service
NORETURN msg_fatal(const char *fmt,...)
#define MAIL_ATTR_NEXTHOP
int vstream_fflush(VSTREAM *stream)
#define GETOPT(argc, argv, str)
#define RESOLVE_FLAG_FINAL
#define IFSET(flag, text)
#define RESOLVE_CLASS_RELAY
#define RESOLVE_CLASS_ALIAS
void resolve_clnt(const char *class, const char *sender, const char *addr, RESOLVE_REPLY *reply)
VSTRING * vstring_free(VSTRING *vp)
char * split_at(char *string, int delimiter)
void msg_vstream_init(const char *name, VSTREAM *vp)
void clnt_stream_recover(CLNT_STREAM *clnt_stream)
#define RESOLVE_CLASS_DEFAULT
#define SEND_ATTR_STR(name, val)
#define MAIL_CLASS_PRIVATE
#define RECV_ATTR_STR(name, val)
void msg_info(const char *fmt,...)