while (a && b)
{
int d;
- if ((d = Ustrncmp(a->text, b->text, 6)) == 0)
- d = Ustrcmp(a->text + 14, b->text + 14);
+ if ((d = Ustrncmp(a->text, b->text, MESSAGE_ID_TIME_LEN)) == 0)
+ {
+ BOOL a_old = is_old_message_id(a->text), b_old = is_old_message_id(b->text);
+ /* Do not worry over the sub-second sorting wrt. old vs. new */
+ d = Ustrcmp(a->text + (a_old ? 6+1+6+1 : MESSAGE_ID_TIME_LEN + 1 + MESSAGE_ID_PID_LEN + 1),
+ b->text + (b_old ? 6+1+6+1 : MESSAGE_ID_TIME_LEN + 1 + MESSAGE_ID_PID_LEN + 1));
+ }
if (d < 0)
{
*append = a;
/* Now scan the directory. */
- for (struct dirent *ent; ent = readdir(dd); )
+ for (struct dirent * ent; ent = readdir(dd); )
{
- uschar *name = US ent->d_name;
+ uschar * name = US ent->d_name;
int len = Ustrlen(name);
/* Count entries */
/* Otherwise, if it is a header spool file, add it to the list */
- if (len == SPOOL_NAME_LENGTH &&
- Ustrcmp(name + SPOOL_NAME_LENGTH - 2, "-H") == 0)
+ if ( (len == SPOOL_NAME_LENGTH || len == SPOOL_NAME_LENGTH_OLD)
+ && Ustrcmp(name + len - 2, "-H") == 0
+ )
if (pcount)
(*pcount)++;
else
{
queue_filename * next =
- store_get(sizeof(queue_filename) + Ustrlen(name), name);
+ store_get(sizeof(queue_filename) + len, name);
Ustrcpy(next->text, name);
next->dir_uschar = subdirchar;
/* Now deliver the message; get the id by cutting the -H off the file
name. The return of the process is zero if a delivery was attempted. */
+ fq->text[Ustrlen(fq->text)-2] = 0;
set_process_info("running queue: %s", fq->text);
- fq->text[SPOOL_NAME_LENGTH-2] = 0;
#ifdef MEASURE_TIMING
report_time_since(×tamp_startup, US"queue msg selected");
#endif
*/
void
-queue_list(int option, uschar **list, int count)
+queue_list(int option, uschar ** list, int count)
{
int subcount;
int now = (int)time(NULL);
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;
that precedes the data. */
if (Ustat(fname, &statbuf) == 0)
- size = message_size + statbuf.st_size - SPOOL_DATA_START_OFFSET + 1;
+ size = message_size + statbuf.st_size - spool_data_start_offset(qf->text) + 1;
i = (now - received_time.tv_sec)/60; /* minutes on queue */
if (i > 90)
{
}
}
- 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)
{
{
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");
}
*/
BOOL
-queue_action(uschar *id, int action, uschar **argv, int argc, int recipients_arg)
+queue_action(uschar * id, int action, uschar ** argv, int argc,
+ int recipients_arg)
{
BOOL yield = TRUE;
BOOL removed = FALSE;
}
while((rc = read(fd, big_buffer, big_buffer_size)) > 0)
- rc = write(fileno(stdout), big_buffer, rc);
+ rc = write(fileno(stdout), big_buffer, rc); /*XXX why not fwrite() ? */
(void)close(fd);
return TRUE;
case MSG_REMOVE:
{
- uschar suffix[3];
+ uschar suffix[3] = { [0]='-', [2]=0 };
- suffix[0] = '-';
- suffix[2] = 0;
- message_subdir[0] = id[5];
+ message_subdir[0] = id[MESSAGE_ID_TIME_LEN - 1];
for (int j = 0; j < 2; message_subdir[0] = 0, j++)
{