"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/spool_mbox.c" between
exim-4.91.tar.xz and exim-4.92.tar.xz

About: Exim is a message transfer agent (MTA).

spool_mbox.c  (exim-4.91.tar.xz):spool_mbox.c  (exim-4.92.tar.xz)
skipping to change at line 38 skipping to change at line 38
*/ */
FILE * FILE *
spool_mbox(unsigned long *mbox_file_size, const uschar *source_file_override, spool_mbox(unsigned long *mbox_file_size, const uschar *source_file_override,
uschar ** mbox_fname) uschar ** mbox_fname)
{ {
uschar message_subdir[2]; uschar message_subdir[2];
uschar buffer[16384]; uschar buffer[16384];
uschar *temp_string; uschar *temp_string;
uschar *mbox_path; uschar *mbox_path;
FILE *mbox_file = NULL; FILE *mbox_file = NULL, *l_data_file = NULL, *yield = NULL;
FILE *data_file = NULL;
FILE *yield = NULL;
header_line *my_headerlist; header_line *my_headerlist;
struct stat statbuf; struct stat statbuf;
int i, j; int i, j;
void *reset_point; void *reset_point;
mbox_path = string_sprintf("%s/scan/%s/%s.eml", mbox_path = string_sprintf("%s/scan/%s/%s.eml",
spool_directory, message_id, message_id); spool_directory, message_id, message_id);
if (mbox_fname) *mbox_fname = mbox_path; if (mbox_fname) *mbox_fname = mbox_path;
reset_point = store_get(0); reset_point = store_get(0);
skipping to change at line 111 skipping to change at line 109
} }
/* End headers */ /* End headers */
if (fwrite("\n", 1, 1, mbox_file) != 1) if (fwrite("\n", 1, 1, mbox_file) != 1)
{ {
log_write(0, LOG_MAIN|LOG_PANIC, "Error/short write while writing \ log_write(0, LOG_MAIN|LOG_PANIC, "Error/short write while writing \
message headers to %s", mbox_path); message headers to %s", mbox_path);
goto OUT; goto OUT;
} }
/* copy body file */ /* Copy body file. If the main receive still has it open then it is holding
if (!source_file_override) a lock, and we must not close it (which releases the lock), so just use the
global file handle. */
if (source_file_override)
l_data_file = Ufopen(source_file_override, "rb");
else if (spool_data_file)
l_data_file = spool_data_file;
else
{ {
message_subdir[1] = '\0'; message_subdir[1] = '\0';
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
{ {
message_subdir[0] = split_spool_directory == (i == 0) ? message_id[5] : 0; message_subdir[0] = split_spool_directory == (i == 0) ? message_id[5] : 0;
temp_string = spool_fname(US"input", message_subdir, message_id, US"-D"); temp_string = spool_fname(US"input", message_subdir, message_id, US"-D");
if ((data_file = Ufopen(temp_string, "rb"))) break; if ((l_data_file = Ufopen(temp_string, "rb"))) break;
} }
} }
else
data_file = Ufopen(source_file_override, "rb");
if (!data_file) if (!l_data_file)
{ {
log_write(0, LOG_MAIN|LOG_PANIC, "Could not open datafile for message %s", log_write(0, LOG_MAIN|LOG_PANIC, "Could not open datafile for message %s",
message_id); message_id);
goto OUT; goto OUT;
} }
/* The code used to use this line, but it doesn't work in Cygwin. /* The code used to use this line, but it doesn't work in Cygwin.
(void)fread(data_buffer, 1, 18, data_file); (void)fread(data_buffer, 1, 18, l_data_file);
What's happening is that spool_mbox used to use an fread to jump over the What's happening is that spool_mbox used to use an fread to jump over the
file header. That fails under Cygwin because the header is locked, but file header. That fails under Cygwin because the header is locked, but
doing an fseek succeeds. We have to output the leading newline doing an fseek succeeds. We have to output the leading newline
explicitly, because the one in the file is parted of the locked area. */ explicitly, because the one in the file is parted of the locked area. */
if (!source_file_override) if (!source_file_override)
(void)fseek(data_file, SPOOL_DATA_START_OFFSET, SEEK_SET); (void)fseek(l_data_file, SPOOL_DATA_START_OFFSET, SEEK_SET);
do do
{ {
uschar * s; uschar * s;
if (!spool_file_wireformat || source_file_override) if (!f.spool_file_wireformat || source_file_override)
j = fread(buffer, 1, sizeof(buffer), data_file); j = fread(buffer, 1, sizeof(buffer), l_data_file);
else /* needs CRLF -> NL */ else /* needs CRLF -> NL */
if ((s = US fgets(CS buffer, sizeof(buffer), data_file))) if ((s = US fgets(CS buffer, sizeof(buffer), l_data_file)))
{ {
uschar * p = s + Ustrlen(s) - 1; uschar * p = s + Ustrlen(s) - 1;
if (*p == '\n' && p[-1] == '\r') if (*p == '\n' && p[-1] == '\r')
*--p = '\n'; *--p = '\n';
else if (*p == '\r') else if (*p == '\r')
ungetc(*p--, data_file); ungetc(*p--, l_data_file);
j = p - buffer; j = p - buffer;
} }
else else
j = 0; j = 0;
if (j > 0) if (j > 0)
if (fwrite(buffer, j, 1, mbox_file) != 1) if (fwrite(buffer, j, 1, mbox_file) != 1)
{ {
log_write(0, LOG_MAIN|LOG_PANIC, "Error/short write while writing \ log_write(0, LOG_MAIN|LOG_PANIC, "Error/short write while writing \
skipping to change at line 193 skipping to change at line 195
if ( !(yield = Ufopen(mbox_path,"rb")) if ( !(yield = Ufopen(mbox_path,"rb"))
|| fstat(fileno(yield), &statbuf) != 0 || fstat(fileno(yield), &statbuf) != 0
) )
log_write(0, LOG_MAIN|LOG_PANIC, "%s", string_open_failed(errno, log_write(0, LOG_MAIN|LOG_PANIC, "%s", string_open_failed(errno,
"scan file %s", mbox_path)); "scan file %s", mbox_path));
else else
*mbox_file_size = statbuf.st_size; *mbox_file_size = statbuf.st_size;
OUT: OUT:
if (data_file) (void)fclose(data_file); if (l_data_file && !spool_data_file) (void)fclose(l_data_file);
if (mbox_file) (void)fclose(mbox_file); if (mbox_file) (void)fclose(mbox_file);
store_reset(reset_point); store_reset(reset_point);
return yield; return yield;
} }
/* remove mbox spool file and temp directory */ /* remove mbox spool file and temp directory */
void void
unspool_mbox(void) unspool_mbox(void)
{ {
spam_ok = 0; spam_ok = 0;
malware_ok = 0; malware_ok = 0;
if (spool_mbox_ok && !no_mbox_unspool) if (spool_mbox_ok && !f.no_mbox_unspool)
{ {
uschar *mbox_path; uschar *mbox_path;
uschar *file_path; uschar *file_path;
struct dirent *entry; struct dirent *entry;
DIR *tempdir; DIR *tempdir;
mbox_path = string_sprintf("%s/scan/%s", spool_directory, spooled_message_id); mbox_path = string_sprintf("%s/scan/%s", spool_directory, spooled_message_id);
if (!(tempdir = opendir(CS mbox_path))) if (!(tempdir = opendir(CS mbox_path)))
{ {
 End of changes. 12 change blocks. 
17 lines changed or deleted 19 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)