X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=blobdiff_plain;f=src%2Fsrc%2Fqueue.c;h=dadd034d6b6e0bb18524856f0da5180847e46023;hp=e7ae019d2f1c0892d166ddab14d6297bfa946acf;hb=42427533718a750c21e3bc03df94c6f93581eaec;hpb=f267271de69d5c6c090e16ebd64041b50a844852 diff --git a/src/src/queue.c b/src/src/queue.c index e7ae019d2..dadd034d6 100644 --- a/src/src/queue.c +++ b/src/src/queue.c @@ -12,7 +12,7 @@ -/* Routines with knowlege of spool layout */ +/* Routines with knowledge of spool layout */ #ifndef COMPILE_UTILITY static void @@ -80,7 +80,11 @@ queue_filename *first = NULL; queue_filename **append = &first; while (a && b) - if (Ustrcmp(a->text, b->text) < 0) + { + int d; + if ((d = Ustrncmp(a->text, b->text, 6)) == 0) + d = Ustrcmp(a->text + 14, b->text + 14); + if (d < 0) { *append = a; append= &a->next; @@ -92,6 +96,7 @@ while (a && b) append= &b->next; b = b->next; } + } *append = a ? a : b; return first; @@ -278,7 +283,7 @@ for (; i <= *subcount; i++) if (root[j]) { next = merge_queue_lists(next, root[j]); - root[j] = (j == LOG2_MAXNODES - 1)? next : NULL; + root[j] = j == LOG2_MAXNODES - 1 ? next : NULL; } else { @@ -405,28 +410,18 @@ if (!recurse) *p = 0; p = big_buffer; - sprintf(CS p, "pid=%d", (int)queue_run_pid); - while (*p != 0) p++; + p += sprintf(CS p, "pid=%d", (int)queue_run_pid); if (extras[0] != 0) - { - sprintf(CS p, " -q%s", extras); - while (*p != 0) p++; - } + p += sprintf(CS p, " -q%s", extras); - if (deliver_selectstring != NULL) - { - sprintf(CS p, " -R%s %s", deliver_selectstring_regex? "r" : "", + if (deliver_selectstring) + p += sprintf(CS p, " -R%s %s", deliver_selectstring_regex? "r" : "", deliver_selectstring); - while (*p != 0) p++; - } - if (deliver_selectstring_sender != NULL) - { - sprintf(CS p, " -S%s %s", deliver_selectstring_sender_regex? "r" : "", + if (deliver_selectstring_sender) + p += sprintf(CS p, " -S%s %s", deliver_selectstring_sender_regex? "r" : "", deliver_selectstring_sender); - while (*p != 0) p++; - } log_detail = string_copy(big_buffer); if (*queue_name) @@ -438,10 +433,10 @@ if (!recurse) /* If deliver_selectstring is a regex, compile it. */ -if (deliver_selectstring != NULL && deliver_selectstring_regex) +if (deliver_selectstring && deliver_selectstring_regex) selectstring_regex = regex_must_compile(deliver_selectstring, TRUE, FALSE); -if (deliver_selectstring_sender != NULL && deliver_selectstring_sender_regex) +if (deliver_selectstring_sender && deliver_selectstring_sender_regex) selectstring_regex_sender = regex_must_compile(deliver_selectstring_sender, TRUE, FALSE); @@ -455,13 +450,13 @@ any messages therein), and then repeats for any subdirectories that were found. When the first argument of queue_get_spool_list() is 0, it scans the top directory, fills in subdirs, and sets subcount. The order of the directories is then randomized after the first time through, before they are scanned in -subsqeuent iterations. +subsequent iterations. When the first argument of queue_get_spool_list() is -1 (for queue_run_in_ order), it scans all directories and makes a single message list. */ -for (i = (queue_run_in_order? -1 : 0); - i <= (queue_run_in_order? -1 : subcount); +for (i = queue_run_in_order ? -1 : 0; + i <= (queue_run_in_order ? -1 : subcount); i++) { queue_filename *f; @@ -606,6 +601,9 @@ for (i = (queue_run_in_order? -1 : 0); /* Recover store used when reading the header */ + received_protocol = NULL; + sender_address = sender_ident = NULL; + authenticated_id = authenticated_sender = NULL; store_reset(reset_point2); if (!wanted) continue; /* With next message */ } @@ -857,19 +855,16 @@ if (option >= 8) option -= 8; /* Now scan the chain and print information, resetting store used each time. */ -reset_point = store_get(0); - -for (; f != NULL; f = f->next) +for (reset_point = store_get(0); f; f = f->next) { int rc, save_errno; int size = 0; BOOL env_read; - store_reset(reset_point); message_size = 0; message_subdir[0] = f->dir_uschar; rc = spool_read_header(f->text, FALSE, count <= 0); - if (rc == spool_read_notopen && errno == ENOENT && count <= 0) continue; + if (rc == spool_read_notopen && errno == ENOENT && count <= 0) goto next; save_errno = errno; env_read = (rc == spool_read_OK || rc == spool_read_hdrerror); @@ -890,7 +885,7 @@ for (; f != NULL; f = f->next) if (Ustat(fname, &statbuf) == 0) size = message_size + statbuf.st_size - SPOOL_DATA_START_OFFSET + 1; - i = (now - received_time)/60; /* minutes on queue */ + i = (now - received_time.tv_sec)/60; /* minutes on queue */ if (i > 90) { i = (i + 30)/60; @@ -901,8 +896,7 @@ for (; f != NULL; f = f->next) /* Collect delivered addresses from any J file */ fname[ptr] = 'J'; - jread = Ufopen(fname, "rb"); - if (jread != NULL) + if ((jread = Ufopen(fname, "rb"))) { while (Ufgets(big_buffer, big_buffer_size, jread) != NULL) { @@ -917,7 +911,7 @@ for (; f != NULL; f = f->next) fprintf(stdout, "%s ", string_format_size(size, big_buffer)); for (i = 0; i < 16; i++) fputc(f->text[i], stdout); - if (env_read && sender_address != NULL) + if (env_read && sender_address) { printf(" <%s>", sender_address); if (sender_set_untrusted) printf(" (%s)", originator_login); @@ -940,7 +934,7 @@ for (; f != NULL; f = f->next) if (rc != spool_read_hdrerror) { printf("\n\n"); - continue; + goto next; } } @@ -948,7 +942,7 @@ for (; f != NULL; f = f->next) printf("\n"); - if (recipients_list != NULL) + if (recipients_list) { for (i = 0; i < recipients_count; i++) { @@ -957,12 +951,22 @@ for (; f != NULL; f = f->next) if (!delivered || option != 1) printf(" %s %s\n", (delivered != NULL)? "D":" ", recipients_list[i].address); - if (delivered != NULL) delivered->data.val = TRUE; + if (delivered) delivered->data.val = TRUE; } - if (option == 2 && tree_nonrecipients != NULL) + if (option == 2 && tree_nonrecipients) queue_list_extras(tree_nonrecipients); printf("\n"); } + +next: + received_protocol = NULL; + sender_fullhost = sender_helo_name = + sender_rcvhost = sender_host_address = sender_address = sender_ident = NULL; + sender_host_authenticated = authenticated_sender = authenticated_id = NULL; + interface_address = NULL; + acl_var_m = NULL; + + store_reset(reset_point); } } @@ -1133,10 +1137,14 @@ if (action != MSG_SHOW_COPY) printf("Message %s ", id); switch(action) { case MSG_SHOW_COPY: - deliver_in_buffer = store_malloc(DELIVER_IN_BUFFER_SIZE); - deliver_out_buffer = store_malloc(DELIVER_OUT_BUFFER_SIZE); - transport_write_message(1, NULL, 0); - break; + { + transport_ctx tctx = {{0}}; + deliver_in_buffer = store_malloc(DELIVER_IN_BUFFER_SIZE); + deliver_out_buffer = store_malloc(DELIVER_OUT_BUFFER_SIZE); + tctx.u.fd = 1; + transport_write_message(&tctx, 0); + break; + } case MSG_FREEZE: