diff -urN ../exim-4.94.orig/src/daemon.c ./src/daemon.c --- ../exim-4.94.orig/src/daemon.c 2020-05-30 23:35:38.000000000 +0300 +++ ./src/daemon.c 2020-06-07 11:32:06.038200000 +0300 @@ -599,9 +599,42 @@ whether we have received too many messages in this session for immediate delivery. */ + +#define DEFAULT_ACCEPT_QUEUE_PER_CONNECTION 10 +int accept_queue_per_connection = -1; +if (smtp_accept_queue_per_connection != NULL) + { + uschar *expanded = expand_string(smtp_accept_queue_per_connection); + if (expanded == NULL) + { + if (!f.expand_string_forcedfail) + log_write(0, LOG_MAIN|LOG_PANIC, "expansion of smtp_accept_queue_per_connection " + "failed for message from %s: %s; fallback to default value %d", sender_fullhost, expand_string_message, DEFAULT_ACCEPT_QUEUE_PER_CONNECTION); + } + /* For speed, interpret a decimal number inline here */ + else + { + accept_queue_per_connection = 0; + uschar *s = expanded; + while (isdigit(*s)) + accept_queue_per_connection = accept_queue_per_connection * 10 + *s++ - '0'; + if (*s != 0) + { + log_write(0, LOG_MAIN|LOG_PANIC, "expansion of smtp_accept_queue_per_connection " + "for message from %s contains non-digit: %s; fallback to default value %d", sender_fullhost, expanded, DEFAULT_ACCEPT_QUEUE_PER_CONNECTION); + accept_queue_per_connection = DEFAULT_ACCEPT_QUEUE_PER_CONNECTION; + } + } + } +if (accept_queue_per_connection == -1) accept_queue_per_connection = DEFAULT_ACCEPT_QUEUE_PER_CONNECTION; + + +// if (!session_local_queue_only && +// smtp_accept_queue_per_connection > 0 && +// receive_messagecount > smtp_accept_queue_per_connection) if (!session_local_queue_only && - smtp_accept_queue_per_connection > 0 && - receive_messagecount > smtp_accept_queue_per_connection) + accept_queue_per_connection > 0 && + receive_messagecount > accept_queue_per_connection) { session_local_queue_only = TRUE; queue_only_reason = 2; @@ -637,9 +670,12 @@ "(%d, max %d)", smtp_accept_count, smtp_accept_queue); break; +// case 2: log_write(L_delay_delivery, +// LOG_MAIN, "no immediate delivery: more than %d messages " +// "received in one connection", smtp_accept_queue_per_connection); case 2: log_write(L_delay_delivery, LOG_MAIN, "no immediate delivery: more than %d messages " - "received in one connection", smtp_accept_queue_per_connection); + "received in one connection", accept_queue_per_connection); break; case 3: log_write(L_delay_delivery, diff -urN ../exim-4.94.orig/src/exim.c ./src/exim.c --- ../exim-4.94.orig/src/exim.c 2020-05-30 23:35:38.000000000 +0300 +++ ./src/exim.c 2020-06-07 11:41:08.594778000 +0300 @@ -5631,9 +5631,42 @@ will be TRUE. If it is not, check on the number of messages received in this connection. */ + +#define DEFAULT_ACCEPT_QUEUE_PER_CONNECTION 10 +int accept_queue_per_connection = -1; +if (smtp_accept_queue_per_connection != NULL) + { + uschar *expanded = expand_string(smtp_accept_queue_per_connection); + if (expanded == NULL) + { + if (!f.expand_string_forcedfail) + log_write(0, LOG_MAIN|LOG_PANIC, "expansion of smtp_accept_queue_per_connection " + "failed for message from %s: %s; fallback to default value %d", sender_fullhost, expand_string_message, DEFAULT_ACCEPT_QUEUE_PER_CONNECTION); + } + /* For speed, interpret a decimal number inline here */ + else + { + accept_queue_per_connection = 0; + uschar *s = expanded; + while (isdigit(*s)) + accept_queue_per_connection = accept_queue_per_connection * 10 + *s++ - '0'; + if (*s != 0) + { + log_write(0, LOG_MAIN|LOG_PANIC, "expansion of smtp_accept_queue_per_connection " + "for message from %s contains non-digit: %s; fallback to default value %d", sender_fullhost, expanded, DEFAULT_ACCEPT_QUEUE_PER_CONNECTION); + accept_queue_per_connection = DEFAULT_ACCEPT_QUEUE_PER_CONNECTION; + } + } + } +if (accept_queue_per_connection == -1) accept_queue_per_connection = DEFAULT_ACCEPT_QUEUE_PER_CONNECTION; + + +// if ( !session_local_queue_only +// && smtp_accept_queue_per_connection > 0 +// && receive_messagecount > smtp_accept_queue_per_connection) if ( !session_local_queue_only - && smtp_accept_queue_per_connection > 0 - && receive_messagecount > smtp_accept_queue_per_connection) + && accept_queue_per_connection > 0 + && receive_messagecount > accept_queue_per_connection) { session_local_queue_only = TRUE; queue_only_reason = 2; @@ -5672,9 +5705,12 @@ switch(queue_only_reason) { case 2: +// log_write(L_delay_delivery, +// LOG_MAIN, "no immediate delivery: more than %d messages " +// "received in one connection", smtp_accept_queue_per_connection); log_write(L_delay_delivery, LOG_MAIN, "no immediate delivery: more than %d messages " - "received in one connection", smtp_accept_queue_per_connection); + "received in one connection", accept_queue_per_connection); break; case 3: diff -urN ../exim-4.94.orig/src/globals.c ./src/globals.c --- ../exim-4.94.orig/src/globals.c 2020-05-30 23:35:38.000000000 +0300 +++ ./src/globals.c 2020-06-07 11:32:06.040259000 +0300 @@ -1442,7 +1442,8 @@ int smtp_accept_max_per_connection = 1000; uschar *smtp_accept_max_per_host = NULL; int smtp_accept_queue = 0; -int smtp_accept_queue_per_connection = 10; +//int smtp_accept_queue_per_connection = 10; +uschar *smtp_accept_queue_per_connection = NULL; int smtp_accept_reserve = 0; uschar *smtp_active_hostname = NULL; uschar *smtp_banner = US"$smtp_active_hostname ESMTP " diff -urN ../exim-4.94.orig/src/globals.h ./src/globals.h --- ../exim-4.94.orig/src/globals.h 2020-05-30 23:35:38.000000000 +0300 +++ ./src/globals.h 2020-06-07 11:32:06.040625000 +0300 @@ -922,7 +922,8 @@ extern int smtp_accept_max_per_connection; /* Max msgs per connection */ extern uschar *smtp_accept_max_per_host; /* Max SMTP cons from one IP addr */ extern int smtp_accept_queue; /* Queue after so many connections */ -extern int smtp_accept_queue_per_connection; /* Queue after so many msgs */ +//extern int smtp_accept_queue_per_connection; /* Queue after so many msgs */ +extern uschar *smtp_accept_queue_per_connection; /* Queue after so many msgs */ extern int smtp_accept_reserve; /* Reserve these SMTP connections */ extern uschar *smtp_active_hostname; /* Hostname for this message */ extern uschar *smtp_banner; /* Banner string (to be expanded) */ diff -urN ../exim-4.94.orig/src/readconf.c ./src/readconf.c --- ../exim-4.94.orig/src/readconf.c 2020-05-30 23:35:38.000000000 +0300 +++ ./src/readconf.c 2020-06-07 11:32:06.041515000 +0300 @@ -300,7 +300,7 @@ { "smtp_accept_max_per_connection", opt_int, {&smtp_accept_max_per_connection} }, { "smtp_accept_max_per_host", opt_stringptr, {&smtp_accept_max_per_host} }, { "smtp_accept_queue", opt_int, {&smtp_accept_queue} }, - { "smtp_accept_queue_per_connection", opt_int, {&smtp_accept_queue_per_connection} }, + { "smtp_accept_queue_per_connection", opt_stringptr, {&smtp_accept_queue_per_connection} }, { "smtp_accept_reserve", opt_int, {&smtp_accept_reserve} }, { "smtp_active_hostname", opt_stringptr, {&raw_active_hostname} }, { "smtp_banner", opt_stringptr, {&smtp_banner} },