git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LDAP: Fix comment about delimiter
[exim.git]
/
src
/
src
/
queue.c
diff --git
a/src/src/queue.c
b/src/src/queue.c
index 1ad5a72bd06e47c93e78eb57e8251cbab77da210..dc1c320c70d33416a0d24a95612c9d3306834be9 100644
(file)
--- a/
src/src/queue.c
+++ b/
src/src/queue.c
@@
-1,10
+1,8
@@
-/* $Cambridge: exim/src/src/queue.c,v 1.4 2005/01/04 10:00:42 ph10 Exp $ */
-
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 20
0
5 */
+/* Copyright (c) University of Cambridge 1995 - 20
1
5 */
/* See the file NOTICE for conditions of use and distribution. */
/* Functions that operate on the input queue. */
/* See the file NOTICE for conditions of use and distribution. */
/* Functions that operate on the input queue. */
@@
-453,7
+451,8
@@
for (i = (queue_run_in_order? -1 : 0);
load_average = os_getloadavg();
if (load_average > deliver_queue_load_max)
{
load_average = os_getloadavg();
if (load_average > deliver_queue_load_max)
{
- log_write(0, LOG_MAIN, "abandon queue run (load %.2f, max %.2f)",
+ log_write(L_queue_run, LOG_MAIN, "Abandon queue run: %s (load %.2f, max %.2f)",
+ log_detail,
(double)load_average/1000.0,
(double)deliver_queue_load_max/1000.0);
i = subcount; /* Don't process other directories */
(double)load_average/1000.0,
(double)deliver_queue_load_max/1000.0);
i = subcount; /* Don't process other directories */
@@
-594,7
+593,7
@@
for (i = (queue_run_in_order? -1 : 0);
if (queue_run_pipe == 0)
{
queue_run_pipe = dup(queue_run_pipe);
if (queue_run_pipe == 0)
{
queue_run_pipe = dup(queue_run_pipe);
- close(0);
+
(void)
close(0);
}
/* Before forking to deliver the message, ensure any open and cached
}
/* Before forking to deliver the message, ensure any open and cached
@@
-627,7
+626,7
@@
for (i = (queue_run_in_order? -1 : 0);
/* Close the writing end of the synchronizing pipe in this process,
then wait for the first level process to terminate. */
/* Close the writing end of the synchronizing pipe in this process,
then wait for the first level process to terminate. */
- close(pfd[pipe_write]);
+
(void)
close(pfd[pipe_write]);
set_process_info("running queue: waiting for %s (%d)", f->text, pid);
while (wait(&status) != pid);
set_process_info("running queue: waiting for %s (%d)", f->text, pid);
while (wait(&status) != pid);
@@
-651,7
+650,8
@@
for (i = (queue_run_in_order? -1 : 0);
the mere fact that read() unblocks is enough. */
set_process_info("running queue: waiting for children of %d", pid);
the mere fact that read() unblocks is enough. */
set_process_info("running queue: waiting for children of %d", pid);
- (void)read(pfd[pipe_read], buffer, sizeof(buffer));
+ if (read(pfd[pipe_read], buffer, sizeof(buffer)) > 0)
+ log_write(0, LOG_MAIN|LOG_PANIC, "queue run: unexpected data on pipe");
(void)close(pfd[pipe_read]);
set_process_info("running queue");
(void)close(pfd[pipe_read]);
set_process_info("running queue");
@@
-873,7
+873,7
@@
for (; f != NULL; f = f->next)
big_buffer[n-1] = 0;
tree_add_nonrecipient(big_buffer);
}
big_buffer[n-1] = 0;
tree_add_nonrecipient(big_buffer);
}
- fclose(jread);
+
(void)
fclose(jread);
}
}
}
}
@@
-895,10
+895,8
@@
for (; f != NULL; f = f->next)
sprintf(CS big_buffer, "%s/input/%s/%s", spool_directory, message_subdir,
f->text);
if (Ustat(big_buffer, &statbuf) == 0)
sprintf(CS big_buffer, "%s/input/%s/%s", spool_directory, message_subdir,
f->text);
if (Ustat(big_buffer, &statbuf) == 0)
- {
- int size = statbuf.st_size; /* Because might be a long */
- printf("*** spool format error: size=%d ***", size);
- }
+ printf("*** spool format error: size=" OFF_T_FMT " ***",
+ statbuf.st_size);
else printf("*** spool format error ***");
}
else printf("*** spool read error: %s ***", strerror(save_errno));
else printf("*** spool format error ***");
}
else printf("*** spool read error: %s ***", strerror(save_errno));
@@
-937,9
+935,9
@@
for (; f != NULL; f = f->next)
* Act on a specific message *
*************************************************/
* Act on a specific message *
*************************************************/
-/* Actions that require a list of addresses make use of
-argv/argc/recipients_arg. Other actions do not. This function does its
-
own
authority checking.
+/* Actions that require a list of addresses make use of
argv/argc/
+recipients_arg. Other actions do not. This function does its own
+authority checking.
Arguments:
id id of the message to work on
Arguments:
id id of the message to work on
@@
-1021,9
+1019,9
@@
if (action >= MSG_SHOW_BODY)
}
while((rc = read(fd, big_buffer, big_buffer_size)) > 0)
}
while((rc = read(fd, big_buffer, big_buffer_size)) > 0)
- write(fileno(stdout), big_buffer, rc);
+
rc =
write(fileno(stdout), big_buffer, rc);
- close(fd);
+
(void)
close(fd);
return TRUE;
}
return TRUE;
}
@@
-1066,7
+1064,7
@@
if (spool_read_header(spoolname, TRUE, FALSE) != spool_read_OK)
printf("Spool format error for %s\n", spoolname);
if (action != MSG_REMOVE || !admin_user)
{
printf("Spool format error for %s\n", spoolname);
if (action != MSG_REMOVE || !admin_user)
{
- close(deliver_datafile);
+
(void)
close(deliver_datafile);
deliver_datafile = -1;
return FALSE;
}
deliver_datafile = -1;
return FALSE;
}
@@
-1081,7
+1079,7
@@
why we leave this check until after the headers are read. */
if (!admin_user && (action != MSG_REMOVE || real_uid != originator_uid))
{
printf("Permission denied\n");
if (!admin_user && (action != MSG_REMOVE || real_uid != originator_uid))
{
printf("Permission denied\n");
- close(deliver_datafile);
+
(void)
close(deliver_datafile);
deliver_datafile = -1;
return FALSE;
}
deliver_datafile = -1;
return FALSE;
}
@@
-1094,10
+1092,17
@@
username = (pw != NULL)?
/* Take the necessary action. */
/* Take the necessary action. */
-printf("Message %s ", id);
+
if (action != MSG_SHOW_COPY)
printf("Message %s ", id);
switch(action)
{
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(NULL, 1, 0, 0, NULL, NULL, NULL, NULL, NULL, 0);
+ break;
+
+
case MSG_FREEZE:
if (deliver_freeze)
{
case MSG_FREEZE:
if (deliver_freeze)
{
@@
-1191,11
+1196,11
@@
switch(action)
if (deliver_datafile >= 0) printf("has been removed\n");
else printf("has been removed or did not exist\n");
if (deliver_datafile >= 0) printf("has been removed\n");
else printf("has been removed or did not exist\n");
- if (removed)
+ if (removed)
{
log_write(0, LOG_MAIN, "removed by %s", username);
{
log_write(0, LOG_MAIN, "removed by %s", username);
- log_write(0, LOG_MAIN, "Completed");
- }
+ log_write(0, LOG_MAIN, "Completed");
+ }
break;
break;
@@
-1269,6
+1274,9
@@
switch(action)
{
if (action == MSG_ADD_RECIPIENT)
{
{
if (action == MSG_ADD_RECIPIENT)
{
+#ifdef EXPERIMENTAL_INTERNATIONAL
+ if (string_is_utf8(recipient)) allow_utf8_domains = message_smtputf8 = TRUE;
+#endif
receive_add_recipient(recipient, -1);
log_write(0, LOG_MAIN, "recipient <%s> added by %s",
recipient, username);
receive_add_recipient(recipient, -1);
log_write(0, LOG_MAIN, "recipient <%s> added by %s",
recipient, username);
@@
-1292,6
+1300,9
@@
switch(action)
}
else /* MSG_EDIT_SENDER */
{
}
else /* MSG_EDIT_SENDER */
{
+#ifdef EXPERIMENTAL_INTERNATIONAL
+ if (string_is_utf8(recipient)) allow_utf8_domains = message_smtputf8 = TRUE;
+#endif
sender_address = recipient;
log_write(0, LOG_MAIN, "sender address changed to <%s> by %s",
recipient, username);
sender_address = recipient;
log_write(0, LOG_MAIN, "sender address changed to <%s> by %s",
recipient, username);
@@
-1316,7
+1327,7
@@
switch(action)
/* Closing the datafile releases the lock and permits other processes
to operate on the message (if it still exists). */
/* Closing the datafile releases the lock and permits other processes
to operate on the message (if it still exists). */
-close(deliver_datafile);
+
(void)
close(deliver_datafile);
deliver_datafile = -1;
return yield;
}
deliver_datafile = -1;
return yield;
}
@@
-1340,7
+1351,8
@@
queue_check_only(void)
BOOL *set;
int sep = 0;
struct stat statbuf;
BOOL *set;
int sep = 0;
struct stat statbuf;
-uschar *s, *ss, *name;
+const uschar *s;
+uschar *ss, *name;
uschar buffer[1024];
if (queue_only_file == NULL) return;
uschar buffer[1024];
if (queue_only_file == NULL) return;