241 #define STR(x) vstring_str(x)
242 #define LEN(x) VSTRING_LEN(x)
276 msg_fatal(
"unable to connect to the %s %s service",
297 state->
where =
"receiving message content";
308 static char verp_delims[] =
"-=";
317 state->
where =
"receiving sender address";
322 && strcmp(end_origin,
"-@[]") == 0
323 && (end_prefix = strchr(
STR(state->
buf),
'@')) != 0
324 && --end_prefix < end_origin - 2
325 && end_prefix >
STR(state->
buf));
326 if (verp_requested) {
327 verp_delims[0] = end_prefix[0];
333 memmove(end_prefix, end_prefix + 1, end_origin - end_prefix - 1);
348 static void qmqpd_write_attributes(
QMQPD_STATE *state)
390 static void qmqpd_copy_recipients(
QMQPD_STATE *state)
402 state->
where =
"receiving recipient address";
417 static int qmqpd_next_line(
VSTRING *message,
char **start,
int *len,
420 char *beyond =
STR(message) +
LEN(message);
428 #define UCHARPTR(x) ((unsigned char *) (x))
430 for (cp = *start = *next; ; cp++) {
432 return ((*len = (*next = cp) - *start) > 0 ?
UCHARPTR(cp)[-1] : -1);
434 return ((*len = cp - *start), (*next = cp + 1),
'\n');
436 return ((*len = cp - *start), (*next = cp),
UCHARPTR(cp)[-1]);
442 static void qmqpd_write_content(
QMQPD_STATE *state)
462 "\tby %s (%s) with %s id %s",
467 "\tfor <%s>; %s",
STR(state->
buf),
471 "\tby %s (%s) with %s",
477 #ifdef RECEIVED_ENVELOPE_FROM
480 "\t(envelope-from <%s>)",
STR(state->
buf));
494 if ((ch = qmqpd_next_line(state->
message, &start, &len, &next)) < 0)
501 if (strncmp(start + strspn(start,
">"),
"From ", 5) == 0) {
503 "X-Mailbox-Line: %.*s", len, start);
543 static void qmqpd_reply(
QMQPD_STATE *state,
int log_message,
544 int status_code,
const char *
fmt,...)
580 state->
where =
"sending completion status";
584 "Ok: queued as %s", state->
queue_id);
590 "Error: internal error %d", state->
err);
593 "Error: message too large");
596 "Error: too many hops");
603 "Error: queue file write error");
606 "Error: no recipients specified");
609 "Error: internal error %d", state->
err);
622 qmqpd_open_file(state);
627 state->
where =
"receiving QMQP packet header";
639 qmqpd_read_content(state);
644 qmqpd_copy_sender(state);
649 qmqpd_write_attributes(state);
655 qmqpd_copy_recipients(state);
662 qmqpd_write_content(state);
667 qmqpd_close_file(state);
672 qmqpd_send_status(state);
686 msg_panic(
"qmqpd_proto: unknown status %d", status);
689 state->
reason =
"lost connection";
693 state->
reason =
"read/write timeout";
697 state->
reason =
"netstring format error";
705 state->
reason =
"netstring length exceeds storage limit";
718 qmqpd_receive(state);
719 }
else if (qmqpd_clients->error == 0) {
721 "Error: %s is not authorized to use this service",
725 "Error: server configuration error");
742 static void qmqpd_service(
VSTREAM *stream,
char *unused_service,
char **argv)
750 msg_fatal(
"unexpected command-line argument: %s", argv[0]);
758 msg_fatal(
"all network protocols are disabled (%s = %s)",
790 static void pre_accept(
char *unused_name,
char **unused_argv)
795 msg_info(
"table %s has changed -- restarting", table);
802 static void pre_jail_init(
char *unused_name,
char **unused_argv)
813 static void post_jail_init(
char *unused_name,
char **unused_argv)
828 int main(
int argc,
char **argv)
int mail_stream_finish(MAIL_STREAM *info, VSTRING *why)
#define MAIL_ATTR_ACT_CLIENT_AF
#define MATCH_FLAG_RETURN
void netstring_fflush(VSTREAM *stream)
#define CA_MAIL_SERVER_BOOL_TABLE(v)
int match_parent_style(const char *name)
int debug_peer_check(const char *name, const char *addr)
void qmqpd_state_free(QMQPD_STATE *)
char * mystrdup(const char *str)
char * var_cleanup_service
int smtputf8_autodetect(int class)
void mail_stream_cleanup(MAIL_STREAM *info)
const char * mail_date(time_t when)
#define VAR_QMQPD_CLIENTS
#define NETSTRING_ERR_FORMAT
#define CLEANUP_STAT_SIZE
NORETURN msg_panic(const char *fmt,...)
#define CA_MAIL_SERVER_STR_TABLE(v)
VSTRING * netstring_get(VSTREAM *stream, VSTRING *buf, ssize_t limit)
#define MAIL_SRC_MASK_QMQPD
ssize_t netstring_get_length(VSTREAM *stream)
#define inet_proto_info()
void netstring_setup(VSTREAM *stream, int timeout)
QMQPD_STATE * qmqpd_state_alloc(VSTREAM *)
VSTRING * vstring_truncate(VSTRING *vp, ssize_t len)
#define MAIL_ATTR_ACT_CLIENT_ADDR
MAIL_VERSION_STAMP_DECLARE
#define CLEANUP_STAT_HOPS
#define vstream_setjmp(stream)
#define DEF_QMQPD_CLIENTS
#define MAIL_ATTR_LOG_PROTO_NAME
#define VSTRING_TERMINATE(vp)
#define NETSTRING_ERR_SIZE
#define MAIL_CLASS_PUBLIC
#define CA_MAIL_SERVER_POST_INIT(v)
#define REC_PUT_BUF(v, t, b)
#define VSTRING_ADDCH(vp, ch)
#define MAIL_ATTR_ACT_CLIENT_PORT
#define MAIL_ATTR_LOG_ORIGIN
const char * dict_changed_name(void)
#define vstream_ungetc(vp, ch)
#define REC_TYPE_TIME_FORMAT
#define VSTRING_RESET(vp)
int rec_fputs(VSTREAM *stream, int type, const char *str)
void msg_warn(const char *fmt,...)
#define MAIL_ATTR_ACT_CLIENT_NAME
#define VAR_QMQPD_CLIENT_PORT_LOG
struct timeval arrival_time
int qmqpd_input_transp_mask
int main(int argc, char **argv)
void debug_peer_init(void)
#define MAIL_VERSION_STAMP_ALLOCATE
#define VAR_INET_PROTOCOLS
void debug_peer_restore(void)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define DEF_QMQPD_CLIENT_PORT_LOG
#define MAIL_ATTR_LOG_CLIENT_ADDR
#define CA_MAIL_SERVER_TIME_TABLE(v)
#define SEND_ATTR_INT(name, val)
int rec_put(VSTREAM *stream, int type, const char *data, ssize_t len)
const char * verp_delims_verify(const char *delims)
NORETURN msg_fatal(const char *fmt,...)
MAIL_STREAM * mail_stream_service(const char *class, const char *name)
int vstream_fflush(VSTREAM *stream)
#define namadr_list_match
#define CLEANUP_STAT_CONT
#define CLEANUP_FLAG_MASK_EXTERNAL
char * mystrndup(const char *str, ssize_t len)
#define NETSTRING_ERR_EOF
#define NETSTRING_ERR_TIME
#define quote_822_local(dst, src)
#define CLEANUP_STAT_RCPT
VSTRING * vstring_vsprintf_append(VSTRING *vp, const char *format, va_list ap)
#define MAIL_ATTR_LOG_CLIENT_NAME
bool var_qmqpd_client_port_log
NORETURN single_server_main(int, char **, SINGLE_SERVER_FN,...)
char * var_inet_protocols
#define CLEANUP_STAT_WRITE
#define MAIL_ATTR_ACT_PROTO_NAME
#define CLEANUP_STAT_DEFER
#define CA_MAIL_SERVER_PRE_ACCEPT(v)
#define DEF_QMTPD_ERR_SLEEP
#define VAR_QMTPD_ERR_SLEEP
int rec_fprintf(VSTREAM *stream, int type, const char *format,...)
#define MAIL_ATTR_LOG_CLIENT_PORT
#define NETSTRING_PUT_BUF(str, buf)
#define REC_TYPE_TIME_ARG(tv)
#define CA_MAIL_SERVER_PRE_INIT(v)
void msg_info(const char *fmt,...)
#define namadr_list_init(o, f, p)