summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/doc-docbook/spec.xfpt9
-rw-r--r--doc/doc-txt/NewStuff2
-rw-r--r--src/src/exim.c18
-rw-r--r--src/src/macros.h7
-rw-r--r--src/src/queue.c36
-rw-r--r--test/scripts/0000-Basic/01554
-rw-r--r--test/stdout/015516
7 files changed, 68 insertions, 24 deletions
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 8e2e1d142..0ba62ce5e 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -3272,6 +3272,12 @@ to the standard output. It is restricted to admin users, unless
&%queue_list_requires_admin%& is set false.
+.cmdopt -bpi
+.cindex queue "list of message IDs"
+This option operates like &%-bp%&, but only outputs message ids
+(one per line).
+
+
.cmdopt -bpr
This option operates like &%-bp%&, but the output is not sorted into
chronological order of message arrival. This can speed it up when there are
@@ -3281,6 +3287,9 @@ going to be post-processed in a way that doesn't need the sorting.
.cmdopt -bpra
This option is a combination of &%-bpr%& and &%-bpa%&.
+.cmdopt -bpri
+This option is a combination of &%-bpr%& and &%-bpi%&.
+
.cmdopt -bpru
This option is a combination of &%-bpr%& and &%-bpu%&.
diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index ba204c040..d12246e03 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -27,6 +27,8 @@ Version 4.97
9. An expansion operator for wrapping long header lines.
+ 10. A commandline option to print just the message IDs of the queue
+
Version 4.96
------------
diff --git a/src/src/exim.c b/src/src/exim.c
index 8d13bd478..c16beb1af 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -1745,7 +1745,7 @@ int filter_sfd = -1;
int filter_ufd = -1;
int group_count;
int i, rv;
-int list_queue_option = 0;
+int list_queue_option = QL_BASIC;
int msg_action = 0;
int msg_action_arg = -1;
int namelen = argv[0] ? Ustrlen(argv[0]) : 0;
@@ -2388,11 +2388,9 @@ on the second character (the one after '-'), to save some effort. */
}
if (*argrest == 'r')
- {
- list_queue_option = 8;
- argrest++;
- }
- else list_queue_option = 0;
+ list_queue_option = QL_UNSORTED, argrest++;
+ else
+ list_queue_option = QL_BASIC;
list_queue = TRUE;
@@ -2402,11 +2400,15 @@ on the second character (the one after '-'), to save some effort. */
/* -bpu: List the contents of the mail queue, top-level undelivered */
- else if (Ustrcmp(argrest, "u") == 0) list_queue_option += 1;
+ else if (Ustrcmp(argrest, "u") == 0) list_queue_option |= QL_UNDELIVERED_ONLY;
/* -bpa: List the contents of the mail queue, including all delivered */
- else if (Ustrcmp(argrest, "a") == 0) list_queue_option += 2;
+ else if (Ustrcmp(argrest, "a") == 0) list_queue_option |= QL_PLUS_GENERATED;
+
+ /* -bpi: List only message IDs */
+
+ else if (Ustrcmp(argrest, "i") == 0) list_queue_option |= QL_MSGID_ONLY;
/* Unknown after -bp[r] */
diff --git a/src/src/macros.h b/src/src/macros.h
index 3b0293b97..9f3a7b06a 100644
--- a/src/src/macros.h
+++ b/src/src/macros.h
@@ -1140,4 +1140,11 @@ typedef unsigned mcs_flags;
/* A big number for (effectively) unlimited envelope addresses */
#define UNLIMITED_ADDRS 999999
+/* Flags for queue_list() */
+#define QL_BASIC 0
+#define QL_UNDELIVERED_ONLY 1
+#define QL_PLUS_GENERATED 2
+#define QL_MSGID_ONLY 3
+#define QL_UNSORTED 8
+
/* End of macros.h */
diff --git a/src/src/queue.c b/src/src/queue.c
index d01cde655..b6e7907d7 100644
--- a/src/src/queue.c
+++ b/src/src/queue.c
@@ -913,7 +913,7 @@ Returns: nothing
*/
void
-queue_list(int option, uschar **list, int count)
+queue_list(int option, uschar ** list, int count)
{
int subcount;
int now = (int)time(NULL);
@@ -942,21 +942,25 @@ if (count > 0)
else
qf = queue_get_spool_list(
- -1, /* entire queue */
- subdirs, /* for holding sub list */
- &subcount, /* for subcount */
- option >= 8, /* randomize if required */
- NULL); /* don't just count */
+ -1, /* entire queue */
+ subdirs, /* for holding sub list */
+ &subcount, /* for subcount */
+ option >= QL_UNSORTED, /* randomize if required */
+ NULL); /* don't just count */
-if (option >= 8) option -= 8;
+option &= ~QL_UNSORTED;
/* Now scan the chain and print information, resetting store used
each time. */
-for (;
- qf && (reset_point = store_mark());
- spool_clear_header_globals(), store_reset(reset_point), qf = qf->next
- )
+if (option == QL_MSGID_ONLY) /* Print only the message IDs from the chain */
+ for (; qf; qf = qf->next)
+ fprintf(stdout, "%.*s\n", MESSAGE_ID_LENGTH, qf->text);
+
+else for (;
+ qf && (reset_point = store_mark());
+ spool_clear_header_globals(), store_reset(reset_point), qf = qf->next
+ )
{
int rc, save_errno;
int size = 0;
@@ -1010,8 +1014,8 @@ for (;
}
}
- fprintf(stdout, "%s ", string_format_size(size, big_buffer));
- for (int i = 0; i < 16; i++) fputc(qf->text[i], stdout);
+ fprintf(stdout, "%s %.*s",
+ string_format_size(size, big_buffer), MESSAGE_ID_LENGTH, qf->text);
if (env_read && sender_address)
{
@@ -1048,14 +1052,14 @@ for (;
{
for (int i = 0; i < recipients_count; i++)
{
- tree_node *delivered =
+ tree_node * delivered =
tree_search(tree_nonrecipients, recipients_list[i].address);
- if (!delivered || option != 1)
+ if (!delivered || option != QL_UNDELIVERED_ONLY)
printf(" %s %s\n",
delivered ? "D" : " ", recipients_list[i].address);
if (delivered) delivered->data.val = TRUE;
}
- if (option == 2 && tree_nonrecipients)
+ if (option == QL_PLUS_GENERATED && tree_nonrecipients)
queue_list_extras(tree_nonrecipients);
printf("\n");
}
diff --git a/test/scripts/0000-Basic/0155 b/test/scripts/0000-Basic/0155
index 3cf45f8af..b221707f2 100644
--- a/test/scripts/0000-Basic/0155
+++ b/test/scripts/0000-Basic/0155
@@ -28,8 +28,12 @@ exim -odq i@test.ex
millisleep 500
exim -odq j@test.ex
****
+### exim -bp
exim -bp
****
+### exim -bpi
+exim -bpi
+****
exim -q
****
no_msglog_check
diff --git a/test/stdout/0155 b/test/stdout/0155
index 272078b57..3ec38cf41 100644
--- a/test/stdout/0155
+++ b/test/stdout/0155
@@ -1,3 +1,4 @@
+### exim -bp
0m sss 10HmaX-0005vi-00 <CALLER@test.ex>
a@test.ex
@@ -28,3 +29,18 @@
0m sss 10HmbG-0005vi-00 <CALLER@test.ex>
j@test.ex
+### exim -bpi
+10HmaX-0005vi-00
+10HmaY-0005vi-00
+10HmaZ-0005vi-00
+10HmbA-0005vi-00
+10HmbB-0005vi-00
+10HmbC-0005vi-00
+10HmbD-0005vi-00
+10HmbE-0005vi-00
+10HmbF-0005vi-00
+10HmbG-0005vi-00
+
+******** SERVER ********
+### exim -bp
+### exim -bpi