X-Git-Url: https://git.exim.org/users/jgh/exim.git/blobdiff_plain/0d46a8c87e92e8136cf1f0f6985b3a87815517f5..130212d30d47e588c2bc03edcfce11bf3857da03:/src/exim_monitor/em_queue.c?ds=sidebyside diff --git a/src/exim_monitor/em_queue.c b/src/exim_monitor/em_queue.c index ec54116a0..d4c01a628 100644 --- a/src/exim_monitor/em_queue.c +++ b/src/exim_monitor/em_queue.c @@ -1,10 +1,8 @@ -/* $Cambridge: exim/src/exim_monitor/em_queue.c,v 1.4 2006/02/14 14:26:15 ph10 Exp $ */ - /************************************************* * Exim Monitor * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2006 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ @@ -65,7 +63,8 @@ if it is dest_remove, remove if present and return NULL. The address is lowercased to start with, unless it begins with "*", which it does for error messages. */ -dest_item *find_dest(queue_item *q, uschar *name, int action, BOOL caseless) +dest_item * +find_dest(queue_item *q, uschar *name, int action, BOOL caseless) { dest_item *dd; dest_item **d = &(q->destinations); @@ -110,7 +109,8 @@ return dd; * Clean up a dead queue item * *************************************************/ -static void clean_up(queue_item *p) +static void +clean_up(queue_item *p) { dest_item *dd = p->destinations; while (dd != NULL) @@ -124,15 +124,39 @@ store_free(p); } +/************************************************* +* Set up an ACL variable * +*************************************************/ + +/* The spool_read_header() function calls acl_var_create() when it reads in an +ACL variable. We know that in this case, the variable will be new, not re-used, +so this is a cut-down version, to save including the whole acl.c module (which +would need conditional compilation to cut most of it out). */ + +tree_node * +acl_var_create(uschar *name) +{ +tree_node *node, **root; +root = (name[0] == 'c')? &acl_var_c : &acl_var_m; +node = store_get(sizeof(tree_node) + Ustrlen(name), FALSE); +Ustrcpy(node->name, name); +node->data.ptr = NULL; +(void)tree_insertnode(root, node); +return node; +} + + + /************************************************* * Set up new queue item * *************************************************/ -static queue_item *set_up(uschar *name, int dir_char) +static queue_item * +set_up(uschar *name, int dir_char) { int i, rc, save_errno; struct stat statdata; -void *reset_point; +rmark reset_point; uschar *p; queue_item *q = (queue_item *)store_malloc(sizeof(queue_item)); uschar buffer[256]; @@ -141,7 +165,7 @@ uschar buffer[256]; q->next = q->prev = NULL; q->destinations = NULL; -Ustrcpy(q->name, name); +Ustrncpy(q->name, name, sizeof(q->name)); q->seen = TRUE; q->frozen = FALSE; q->dir_char = dir_char; @@ -158,7 +182,7 @@ Before reading the header remember the position in the dynamic store so that we can recover the store into which the header is read. All data read by spool_read_header that is to be preserved is copied into malloc store. */ -reset_point = store_get(0); +reset_point = store_mark(); message_size = 0; message_subdir[0] = dir_char; sprintf(CS buffer, "%s-H", name); @@ -180,7 +204,7 @@ if it's there. */ else { - q->update_time = q->input_time = received_time; + q->update_time = q->input_time = received_time.tv_sec; if ((p = strstric(sender_address+1, qualify_domain, FALSE)) != NULL && *(--p) == '@') *p = 0; } @@ -198,11 +222,11 @@ if (rc != spool_read_OK) struct stat statbuf; sprintf(CS big_buffer, "%s/input/%s", spool_directory, buffer); if (Ustat(big_buffer, &statbuf) == 0) - msg = string_sprintf("*** Format error in spool file: size = %d ***", + msg = string_sprintf("*** Format error in spool file: size = " OFF_T_FMT " ***", statbuf.st_size); - else msg = string_sprintf("*** Format error in spool file ***"); + else msg = US"*** Format error in spool file ***"; } - else msg = string_sprintf("*** Cannot read spool file ***"); + else msg = US"*** Cannot read spool file ***"; if (rc == spool_read_hdrerror) { @@ -210,7 +234,7 @@ if (rc != spool_read_OK) } else { - deliver_freeze = FALSE; + f.deliver_freeze = FALSE; sender_address = msg; recipients_count = 0; } @@ -218,9 +242,9 @@ if (rc != spool_read_OK) /* Now set up the remaining data. */ -q->frozen = deliver_freeze; +q->frozen = f.deliver_freeze; -if (sender_set_untrusted) +if (f.sender_set_untrusted) { if (sender_address[0] == 0) { @@ -242,7 +266,8 @@ else sender_address = NULL; -sprintf(CS buffer, "%s/input/%s/%s-D", spool_directory, message_subdir, name); +snprintf(CS buffer, sizeof(buffer), "%s/input/%s/%s/%s-D", + spool_directory, queue_name, message_subdir, name); if (Ustat(buffer, &statdata) == 0) q->size = message_size + statdata.st_size - SPOOL_DATA_START_OFFSET + 1; @@ -250,7 +275,6 @@ if (Ustat(buffer, &statdata) == 0) been delivered, and removing visible names. */ if (recipients_list != NULL) - { for (i = 0; i < recipients_count; i++) { uschar *r = recipients_list[i].address; @@ -261,7 +285,6 @@ if (recipients_list != NULL) (void)find_dest(q, r, dest_add, FALSE); } } - } /* Recover the dynamic store used by spool_read_header(). */ @@ -311,7 +334,8 @@ while (p != NULL) -queue_item *find_queue(uschar *name, int action, int dir_char) +queue_item * +find_queue(uschar *name, int action, int dir_char) { int first = 0; int last = queue_index_size - 1; @@ -590,17 +614,19 @@ static void update_recipients(queue_item *p) { int i; FILE *jread; -void *reset_point; +rmark reset_point; struct stat statdata; uschar buffer[1024]; message_subdir[0] = p->dir_char; -sprintf(CS buffer, "%s/input/%s/%s-J", spool_directory, message_subdir, p->name); -jread = fopen(CS buffer, "r"); -if (jread == NULL) +snprintf(CS buffer, sizeof(buffer), "%s/input/%s/%s/%s-J", + spool_directory, queue_name, message_subdir, p->name); + +if (!(jread = fopen(CS buffer, "r"))) { - sprintf(CS buffer, "%s/input/%s/%s-H", spool_directory, message_subdir, p->name); + snprintf(CS buffer, sizeof(buffer), "%s/input/%s/%s/%s-H", + spool_directory, queue_name, message_subdir, p->name); if (Ustat(buffer, &statdata) < 0 || p->update_time == statdata.st_mtime) return; } @@ -608,7 +634,7 @@ if (jread == NULL) /* Get the contents of the header file; if any problem, just give up. Arrange to recover the dynamic store afterwards. */ -reset_point = store_get(0); +reset_point = store_mark(); sprintf(CS buffer, "%s-H", p->name); if (spool_read_header(buffer, FALSE, TRUE) != spool_read_OK) { @@ -634,32 +660,23 @@ if (jread != NULL) been delivered, and removing visible names. In the nonrecipients tree, domains are lower cased. */ -if (recipients_list != NULL) - { +if (recipients_list) for (i = 0; i < recipients_count; i++) { - uschar *pp; - uschar *r = recipients_list[i].address; - tree_node *node = tree_search(tree_nonrecipients, r); + uschar * pp; + uschar * r = recipients_list[i].address; + tree_node * node; - if (node == NULL) - { - uschar temp[256]; - uschar *rr = temp; - Ustrcpy(temp, r); - while (*rr != 0 && *rr != '@') rr++; - while (*rr != 0) { *rr = tolower(*rr); rr++; } - node = tree_search(tree_nonrecipients, temp); - } + if (!(node = tree_search(tree_nonrecipients, r))) + node = tree_search(tree_nonrecipients, string_copylc(r)); - if ((pp = strstric(r+1, qualify_domain, FALSE)) != NULL && - *(--pp) == '@') *pp = 0; - if (node == NULL) + if ((pp = strstric(r+1, qualify_domain, FALSE)) && *(--pp) == '@') + *pp = 0; + if (!node) (void)find_dest(p, r, dest_add, FALSE); else (void)find_dest(p, r, dest_remove, FALSE); } - } /* We also need to scan the tree of non-recipients, which might contain child addresses that are not in the recipients list, but