216 #define STR vstring_str
218 #define VS_NEUTER(s) printable(vstring_str(s), '?')
222 static int bounce_append_proto(
char *service_name,
VSTREAM *client)
224 const char *myname =
"bounce_append_proto";
266 msg_info(
"%s: flags=0x%x service=%s id=%s org_to=%s to=%s off=%ld dsn_org=%s, notif=0x%x stat=%s act=%s why=%s",
267 myname, flags, service_name,
STR(queue_id),
284 &rcpt_buf->
rcpt, &dsn_buf->
dsn));
289 static int bounce_notify_proto(
char *service_name,
VSTREAM *client,
290 int (*service) (
int,
char *,
char *,
char *,
291 char *,
int,
char *,
char *,
int,
294 const char *myname =
"bounce_notify_proto";
331 msg_info(
"%s: flags=0x%x service=%s queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s ret=0x%x",
332 myname, flags, service_name,
STR(queue_name),
STR(queue_id),
333 STR(encoding), smtputf8,
STR(sender),
STR(dsn_envid),
346 return (service(flags, service_name,
STR(queue_name),
347 STR(queue_id),
STR(encoding), smtputf8,
348 STR(sender),
STR(dsn_envid), dsn_ret,
354 static int bounce_verp_proto(
char *service_name,
VSTREAM *client)
356 const char *myname =
"bounce_verp_proto";
394 if (strlen(
STR(verp_delims)) != 2) {
395 msg_warn(
"malformed verp delimiter string: %s",
STR(verp_delims));
399 msg_info(
"%s: flags=0x%x service=%s queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s ret=0x%x delim=%s",
400 myname, flags, service_name,
STR(queue_name),
401 STR(queue_id),
STR(encoding), smtputf8,
STR(sender),
402 STR(dsn_envid), dsn_ret,
STR(verp_delims));
408 if (flags & BOUNCE_FLAG_CLEAN)
417 msg_warn(
"request to send VERP-style notification of bounced mail");
419 STR(queue_id),
STR(encoding), smtputf8,
420 STR(sender),
STR(dsn_envid), dsn_ret,
424 STR(queue_id),
STR(encoding), smtputf8,
425 STR(sender),
STR(dsn_envid), dsn_ret,
426 STR(verp_delims), bounce_templates));
431 static int bounce_one_proto(
char *service_name,
VSTREAM *client)
433 const char *myname =
"bounce_one_proto";
461 msg_warn(
"wrong service name \"%s\" for one-recipient bouncing",
495 msg_info(
"%s: flags=0x%x queue=%s id=%s encoding=%s smtputf8=%d sender=%s envid=%s dsn_ret=0x%x orig_to=%s to=%s off=%ld dsn_orig=%s notif=0x%x stat=%s act=%s why=%s",
496 myname, flags,
STR(queue_name),
STR(queue_id),
497 STR(encoding), smtputf8,
STR(sender),
STR(dsn_envid),
507 STR(encoding), smtputf8,
STR(sender),
508 STR(dsn_envid), dsn_ret, rcpt_buf,
509 dsn_buf, bounce_templates));
514 static void bounce_service(
VSTREAM *client,
char *service_name,
char **argv)
524 msg_fatal(
"unexpected command-line argument: %s", argv[0]);
526 msg_fatal(
"malformed service name: %s", service_name);
537 status = bounce_verp_proto(service_name, client);
539 status = bounce_notify_proto(service_name, client,
542 status = bounce_notify_proto(service_name, client,
545 status = bounce_notify_proto(service_name, client,
548 status = bounce_append_proto(service_name, client);
550 status = bounce_one_proto(service_name, client);
552 msg_warn(
"unknown command: %d", command);
577 static void load_helper(
VSTREAM *stream,
void *context)
586 static void pre_jail_init(
char *unused_name,
char **unused_argv)
604 static void post_jail_init(
char *service_name,
char **unused_argv)
613 if (strcmp(service_name,
"dump_templates") == 0) {
618 if (strcmp(service_name,
"expand_templates") == 0) {
642 int main(
int argc,
char **argv)
int bounce_one_service(int flags, char *queue_name, char *queue_id, char *encoding, int smtputf8, char *orig_sender, char *dsn_envid, int dsn_ret, RCPT_BUF *rcpt_buf, DSN_BUF *dsn_buf, BOUNCE_TEMPLATES *ts)
#define CA_MAIL_SERVER_UNLIMITED
DSN_BUF * dsb_create(void)
int bounce_notify_service(int flags, char *service, char *queue_name, char *queue_id, char *encoding, int smtputf8, char *recipient, char *dsn_envid, int dsn_ret, BOUNCE_TEMPLATES *ts)
#define MAIL_ATTR_ENCODING
int mail_queue_id_ok(const char *queue_id)
#define CA_MAIL_SERVER_STR_TABLE(v)
int bounce_warn_service(int, char *, char *, char *, char *, int, char *, char *, int, BOUNCE_TEMPLATES *)
int rcpb_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp, int flags, void *ptr)
#define RECV_ATTR_INT(name, val)
#define strcasecmp_utf8(s1, s2)
int dsb_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp, int flags, void *ptr)
int mail_queue_name_ok(const char *queue_name)
#define BOUNCE_FLAG_CLEAN
void bounce_cleanup_register(char *service, char *queue_id)
void bounce_templates_expand(VSTREAM *, BOUNCE_TEMPLATES *)
#define DEF_NOTIFY_CLASSES
#define BOUNCE_CMD_APPEND
#define CA_MAIL_SERVER_POST_INIT(v)
#define CA_MAIL_SERVER_INT_TABLE(v)
int main(int argc, char **argv)
RCPT_BUF * rcpb_create(void)
int bounce_notify_verp(int flags, char *service, char *queue_name, char *queue_id, char *encoding, int smtputf8, char *recipient, char *dsn_envid, int dsn_ret, char *verp_delims, BOUNCE_TEMPLATES *ts)
#define DSN_FROM_DSN_BUF(dsb)
char * var_notify_classes
#define MAIL_ATTR_SMTPUTF8
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
#define MAIL_ATTR_DSN_RET
#define MAIL_VERSION_STAMP_ALLOCATE
#define VAR_DELAY_WARN_TIME
#define MAIL_ATTR_DSN_ENVID
BOUNCE_TEMPLATES * bounce_templates
#define CA_MAIL_SERVER_TIME_TABLE(v)
#define SEND_ATTR_INT(name, val)
BOUNCE_TEMPLATES * bounce_templates_create(void)
#define MAIL_SERVICE_BOUNCE
NORETURN msg_fatal(const char *fmt,...)
void bounce_cleanup_log(void)
#define VAR_NOTIFY_CLASSES
int vstream_fflush(VSTREAM *stream)
const char * mail_addr_double_bounce(void)
int bounce_append_service(int unused_flags, char *service, char *queue_id, RECIPIENT *rcpt, DSN *dsn)
#define RECIPIENT_FROM_RCPT_BUF(buf)
void bounce_cleanup_unregister(void)
int bounce_trace_service(int, char *, char *, char *, char *, int, char *, char *, int, BOUNCE_TEMPLATES *)
MAIL_VERSION_STAMP_DECLARE
NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...)
#define RECV_ATTR_FUNC(func, val)
VSTRING * bounce_cleanup_path
void bounce_templates_dump(VSTREAM *, BOUNCE_TEMPLATES *)
#define MAIL_ATTR_QUEUEID
void bounce_templates_load(VSTREAM *, BOUNCE_TEMPLATES *)
void load_file(const char *path, LOAD_FILE_FN action, void *context)
char * printable(char *string, int replacement)
#define vstream_ferror(vp)
#define DEF_MAX_QUEUE_TIME
#define VAR_MAX_QUEUE_TIME
#define CA_MAIL_SERVER_PRE_INIT(v)
#define RECV_ATTR_STR(name, val)
int mail_command_server(VSTREAM *stream,...)
void msg_info(const char *fmt,...)
#define DEF_DELAY_WARN_TIME